10 Minutes to pandas
来源:互联网 发布:淘宝网开店收费吗 编辑:程序博客网 时间:2024/06/06 10:39
导入方式:
import pandas as pdimport numpy as npimport matplotlib.pyplot as plt
一.创建对象
传递一个列表,创建一个Series,默认索引为整型
s=pd.Series([1,3,5,np.nan,6,8])sOut[5]: 0 1.01 3.02 5.03 NaN4 6.05 8.0dtype: float64
创建时间索引
In [7]: dates=pd.date_range('20170721',periods=6)#6 个索引值In [8]: datesOut[8]: DatetimeIndex(['2017-07-21', '2017-07-22', '2017-07-23', '2017-07-24', '2017-07-25', '2017-07-26'], dtype='datetime64[ns]', freq='D')
指定行列索引,创建DataFrame
In [9]: df=pd.DataFrame(np.random.randn(6,4),index=dates,columns['A','B','C','D'])In [10]: dfOut[10]: A B C D2017-07-21 -1.525652 0.122387 -1.259828 -1.2924502017-07-22 0.390645 0.829519 -1.397772 0.4386152017-07-23 0.875678 -1.159174 0.255005 -1.3157992017-07-24 -1.754487 1.285334 0.755246 0.5098242017-07-25 -0.787207 2.083840 0.135200 0.4493182017-07-26 -1.036861 -0.546105 -0.580360 -0.042891
传递一个Series的字典,可以指定列索引,行索引与原Series一样
df=pd.DataFrame(s,columns=['a'])dfOut[20]: a0 1.01 3.02 5.03 NaN4 6.05 8.0
传递一个能够被转换成类似Series的字典来创建一个DataFrame,字典的每一个元素都被看成一个series,key即为列索引,长度不一致可以广播
df2=pd.DataFrame({ 'A':1, 'B':pd.Timestamp('20170721') , 'C':pd.Series([1,2,3,4],index=['z','x','c','s'])})df2Out[43]: A B Cz 1 2017-07-21 1x 1 2017-07-21 2c 1 2017-07-21 3s 1 2017-07-21 4
查看数据类型
df2.dtypesOut[44]: A int64B datetime64[ns]C int64dtype: object
二.查看数据
查看头部5行和尾部5行
In [48]: df.head()Out[48]: A B C D2017-07-21 0.888811 -0.039728 0.660442 -1.0569132017-07-22 1.267505 -0.044836 1.275167 1.0351132017-07-23 0.125988 -1.829078 1.053110 0.0745282017-07-24 -0.139170 -0.704593 0.208797 0.2681832017-07-25 0.800954 0.002910 1.212054 1.790770In [49]: df.tail()Out[49]: A B C D2017-07-22 1.267505 -0.044836 1.275167 1.0351132017-07-23 0.125988 -1.829078 1.053110 0.0745282017-07-24 -0.139170 -0.704593 0.208797 0.2681832017-07-25 0.800954 0.002910 1.212054 1.7907702017-07-26 0.786291 -1.065658 -0.751298 -0.591745
显示索引和数据
In [50]: df.indexOut[50]: DatetimeIndex(['2017-07-21', '2017-07-22', '2017-07-23', '2017-07-24', '2017-07-25', '2017-07-26'], dtype='datetime64[ns]', freq='D')In [51]: df.columnsOut[51]: Index([u'A', u'B', u'C', u'D'], dtype='object')In [52]: df.valuesOut[52]: array([[ 0.88881115, -0.0397281 , 0.66044235, -1.05691294], [ 1.26750516, -0.04483592, 1.27516665, 1.03511314], [ 0.12598841, -1.82907844, 1.05311 , 0.07452816], [-0.13917035, -0.7045935 , 0.20879703, 0.26818348], [ 0.80095357, 0.00290982, 1.21205356, 1.79076959], [ 0.78629106, -1.06565763, -0.75129755, -0.591745 ]])
describe()函数 ,每一列数据的快速统计
In [53]: df.describe()Out[53]: A B C Dcount 6.000000 6.000000 6.000000 6.000000mean 0.621730 -0.613497 0.609712 0.253323std 0.523887 0.737961 0.776904 1.042879min -0.139170 -1.829078 -0.751298 -1.05691325% 0.291064 -0.975392 0.321708 -0.42517750% 0.793622 -0.374715 0.856776 0.17135675% 0.866847 -0.041005 1.172318 0.843381max 1.267505 0.002910 1.275167 1.790770
转置行列,注意df的结构还是没有变,df1是转置后的结构
df1=df.T
In [55]: df.TOut[55]: 2017-07-21 2017-07-22 2017-07-23 2017-07-24 2017-07-25 2017-07-26A 0.888811 1.267505 0.125988 -0.139170 0.800954 0.786291B -0.039728 -0.044836 -1.829078 -0.704593 0.002910 -1.065658C 0.660442 1.275167 1.053110 0.208797 1.212054 -0.751298D -1.056913 1.035113 0.074528 0.268183 1.790770 -0.591745
按轴排序,按照轴的索引值排序,但是排序后依然不变,需赋值才可以使用
df.sort_index(axis=1, ascending=False)
按值进行排序,by='某个列索引'
,按照这个索引的数据从小排序
df.sort_values(by='A')
若想用行索引,可以先转置为 df1=df.T
好像直接by='某个行索引'
不行啊
In [72]: df1.sort_values(by='2017-07-22')Out[72]: 2017-07-21 2017-07-22 2017-07-23 2017-07-24 2017-07-25 2017-07-26B -0.039728 -0.044836 -1.829078 -0.704593 0.002910 -1.065658D -1.056913 1.035113 0.074528 0.268183 1.790770 -0.591745A 0.888811 1.267505 0.125988 -0.139170 0.800954 0.786291C 0.660442 1.275167 1.053110 0.208797 1.212054 -0.751298
三.选择
获取(不太方便认为)
选择一列,返回Series,df[‘A’],同df.A
只能访问一个,不能多个,也不能切片
In [73]: df['A']Out[73]: 2017-07-21 0.8888112017-07-22 1.2675052017-07-23 0.1259882017-07-24 -0.1391702017-07-25 0.8009542017-07-26 0.786291Freq: D, Name: A, dtype: float64In [74]: df.A
通过[ ]进行选择,行的切片
:
可以是索引也可以是标号,但只是按行
通过索引标签的话,包括首位
但是通过数字标号的话,不包括尾,看例子。
df['20170722':'20170724']Out[77]: A B C D2017-07-22 1.267505 -0.044836 1.275167 1.0351132017-07-23 0.125988 -1.829078 1.053110 0.0745282017-07-24 -0.139170 -0.704593 0.208797 0.268183df[0:3]Out[75]: A B C D2017-07-21 0.888811 -0.039728 0.660442 -1.0569132017-07-22 1.267505 -0.044836 1.275167 1.0351132017-07-23 0.125988 -1.829078 1.053110 0.074528
通过标签选择(方便灵活多样推荐)
使用标签来获取一个交叉的区域(注意标签切片包括尾部,后面的数字切片不包括)
In [88]: datesOut[88]: DatetimeIndex(['2017-07-21', '2017-07-22', '2017-07-23', '2017-07-24', '2017-07-25', '2017-07-26'], dtype='datetime64[ns]', freq='D')In [89]: dates[0]Out[89]: Timestamp('2017-07-21 00:00:00', offset='D')
df.loc[dates[0]]
同 df.loc['2017-07-21']
In [91]: df.loc[dates[0]]Out[91]: A 0.888811B -0.039728C 0.660442D -1.056913Name: 2017-07-21 00:00:00, dtype: float64
还可以类似numpy数组的方式切片,也可以单个,不同的是这个切片包括尾部
切片 a:b
包括b
,不同的是a b
为索引标签,不是整数
In [97]: df.loc[:dates[1],['A','B']]Out[97]: A B2017-07-21 0.888811 -0.0397282017-07-22 1.267505 -0.044836In [98]: df.loc[:'2017-07-24',['A','B']]Out[98]: A B2017-07-21 0.888811 -0.0397282017-07-22 1.267505 -0.0448362017-07-23 0.125988 -1.8290782017-07-24 -0.139170 -0.704593
还会进行自动维度缩减,但是还有name参数
In [110]: df.loc[dates[1],['A','B']]Out[110]: A 1.267505B -0.044836Name: 2017-07-22 00:00:00, dtype: float64
若获取某一个标量,有快速方法
df.at[dates[0],'A']#快速df.loc[dates[0],'A']#两个返回内容等价
通过位置选择
通过数值
选择行
In [111]: df.iloc[3]
通过整数的切片,也可以是列表,总之与numpy相同,切片一般不包括尾部
df.iloc[3:5,0:2]df.iloc[[1,2,4],[0,2]]
快速的访问标量方法
df.iat[1,1]
布尔索引
使用一列来选择数据
df[df.A > 0]
对于所有的,则不满足的为NaN
In [114]: df[df > 0]Out[114]: A B C D2017-07-21 0.888811 NaN 0.660442 NaN2017-07-22 1.267505 NaN 1.275167 1.0351132017-07-23 0.125988 NaN 1.053110 0.0745282017-07-24 NaN NaN 0.208797 0.2681832017-07-25 0.800954 0.00291 1.212054 1.7907702017-07-26 0.786291 NaN NaN NaN
使用isin()
方法来过滤
先复制再添加一列
In [116]: df2 = df.copy()In [117]: df2['E'] = ['one', 'one','two','three','four','three']In [118]: df2Out[118]: A B C D E2017-07-21 0.888811 -0.039728 0.660442 -1.056913 one2017-07-22 1.267505 -0.044836 1.275167 1.035113 one2017-07-23 0.125988 -1.829078 1.053110 0.074528 two2017-07-24 -0.139170 -0.704593 0.208797 0.268183 three2017-07-25 0.800954 0.002910 1.212054 1.790770 four2017-07-26 0.786291 -1.065658 -0.751298 -0.591745 three
设置
设置一个新的列,自动排列日期索引
s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
df['F'] = s1
通过标签更改某个值
df.at[dates[0],'A'] = 0df.iat[0,1] = 0
获取行数len()
len(df)Out[147]: 6
通过一个numpy数组设置一组新值
df.loc[:,'D'] = np.array([1,2,3,5,4,5])dfOut[149]: A B C D F2017-07-21 0.888811 -0.039728 0.660442 1 NaN2017-07-22 1.267505 -0.044836 1.275167 2 1.02017-07-23 0.125988 -1.829078 1.053110 3 2.02017-07-24 -0.139170 -0.704593 0.208797 5 3.02017-07-25 0.800954 0.002910 1.212054 4 4.02017-07-26 0.786291 -1.065658 -0.751298 5 5.0
通过where操作来设置新的值
df2 = df.copy()df2[df2 > 0] = -df2
四.缺失值处理
重新索引允许改变,增加,删除具体轴上的索引。返回原始数据的拷贝。
缺失为NaN
In [169]: df1 = df.reindex(index=dates[0:5], columns=list(df.columns) + ['E'])In [170]: df1Out[170]: A B C D F E2017-07-21 0.888811 -0.039728 0.660442 1 NaN NaN2017-07-22 1.267505 -0.044836 1.275167 2 1.0 NaN2017-07-23 0.125988 -1.829078 1.053110 3 2.0 NaN2017-07-24 -0.139170 -0.704593 0.208797 5 3.0 NaN2017-07-25 0.800954 0.002910 1.212054 4 4.0 NaN
去掉包含Nan的行
df1.dropna(how='any')
填充所有的Nan
df1.fillna(value=5)
以布尔值填充
In [176]: pd.isnull(df1)Out[176]: A B C D F E2017-07-21 False False False False True True2017-07-22 False False False False False True2017-07-23 False False False False False True2017-07-24 False False False False False True2017-07-25 False False False False False False
五.相关操作
统计
一般不包括NaN
执行描述性统计,默认按0轴操作
In [178]: df.mean()Out[178]: A 0.621730B -0.613497C 0.609712D 3.333333F 3.000000dtype: float64
在其他轴操作,按行求均值
In [179]: df.mean(1)Out[179]: 2017-07-21 0.6273812017-07-22 1.0995672017-07-23 0.8700042017-07-24 1.4730072017-07-25 2.0031832017-07-26 1.793867Freq: D, dtype: float64
对于一些算数操作,可以广播,如下,第0轴的减法。
df.sub(s, axis=0)Out[188]: A B C D F2017-07-21 -0.111189 -1.039728 -0.339558 0.0 NaN2017-07-22 -1.732495 -3.044836 -1.724833 -1.0 -2.02017-07-23 -4.874012 -6.829078 -3.946890 -2.0 -3.02017-07-24 NaN NaN NaN NaN NaN2017-07-25 -5.199046 -5.997090 -4.787946 -2.0 -2.02017-07-26 -7.213709 -9.065658 -8.751298 -3.0 -3.0
Apply
直方图
字符串方法
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog','cat'])In [201]: s.str.lower()Out[201]: 0 a1 b2 c3 aaba4 baca5 NaN6 caba7 dog8 catdtype: object
保存文件
df.to_csv('路径',encoding='gbk')df=pd.read_csv('路径',encoding='gbk')
- 10 Minutes to pandas
- 10 Minutes to pandas
- 10 MINUTES TO PANDAS(10分钟搞定Pandas)
- pandas官方网站上《10 Minutes to pandas》的简单翻译
- 10 Minutes to pandas----十分钟搞定Pandas
- 十分钟学会pandas《10 Minutes to pandas》
- five minutes to spare
- seconds to minutes
- How to Spend the First 10 Minutes of Your Day
- Permutations - 10 minutes.
- Learn UNIX in 10 minutes
- learn xajax in 10 minutes
- Learn UNIX in 10 minutes
- Regular Expressions in 10 Minutes
- Learn Python in 10 Minutes
- front UAG in 10 minutes
- Learn Python in 10 minutes
- learn python in 10 minutes
- Spring Boot+Mybatis动态数据源配置
- Qt中父子widget的事件传递
- java String类的字符串常量不可变更
- java 字节转为16进制字符的个人理解
- 传输层协议之传输控制协议(TCP)总结
- 10 Minutes to pandas
- ssh更改端口
- 矩阵旋转
- 单例模式C++
- Android面试相关
- JVM重要知识点整理和学习
- vs 2013 添加xunit测试
- Git-理论篇-底层存储和分支结构
- android之实现万能适配RecyclerView的adapter