摘要
Pandas是基于numpy来构建的,让numpy为中心的应用变得更加简单。Pandas主要包括两个数据结构,Series和DataFrame。既能处理时间序列的数据也能处理非时间序列的数据,同时在处理缺省值上面非常灵活。
一.主要数据结构
Series
可以把series理解为一维数组或者向量,由value以及index组成。
1.创建series
>>> import pandas as pd >>> obj=pd.Series([10,9,8,7,6]) >>> obj 0 10 1 9 2 8 3 7 4 6 |
第一列的0-4就是默认的index,第二列就是value。可以手动指定index,如:
>>> obj2=pd.Series([10,9,8,7],index=['one','two','three',4]) >>> obj2 one 10 two 9 three 8 4 7 dtype: int64
|
实际上Series也能理解是python的一个字典,当然也能通过传入一个字典来创建一个Series,字典的key就对应索引,字典的value就是series的value,如:
>>> dic_data={'owen':18,'crespo':28,'ronaldo':20,'cambiasso':46} >>> obj3=pd.Series(dic_data) >>> obj3 cambiasso 46 crespo 28 owen 18 ronaldo 20 dtype: int64 |
也可以指定index,字典中的key不在指定的index中的话,就填充NaN,如:
>>> name=['owen','ronaldo','cambiasso','veron'] >>> obj4=pd.Series(dic_data,name) >>> obj4 owen 18.0 ronaldo 20.0 cambiasso 46.0 veron NaN dtype: float64 |
2,Series的访问
可以通过下标或者索引来直接访问,如:
>>> obj2[2] 8 >>> obj2['one'] 10 >>> obj2[['two',4]] two 9 4 7 dtype: int64 |
DataFrame
DataFrame是表格型数据,有行以及列,类似numpy中的矩阵mt,可以被看做是由Series组成的字典,与R语言中的dataframe类似。
1.创建DataFrame
由字典或者numpy创建,key就是默认的列名,而行默认从0开始排序下去,如:
>>> data={'year':[2001,2002,2003,2001,2005],'country':['china','china','usa','england','German'],'population':[200,300,400,100,50]} >>> df=pd.DataFrame(data) >>> df country population year 0 china 200 2001 1 china 300 2002 2 usa 400 2003 3 england 100 2001 4 German 50 2005
|
也可以指定列名以及index,如果字典中不存在,就填充NaN,与创建series类似。
2.访问DataFrame
可以按照字典或者属性的方式来访问列,如:
>>> df['country'] 0 china 1 china 2 usa 3 england 4 German Name: country, dtype: object >>> df.year 0 2001 1 2002 2 2003 3 2001 4 2005 Name: year, dtype: int64 |
可以使用ix方法来访问某一行,如:
>>> df.ix[0] country china population 200 year 2001 Name: 0, dtype: object |
使用如下的ix+列属性或者列索引的方式来访问行列切片,如:
>>> df.ix[['a','d'],[1,2]] usa england a 1 2 d 7 8 |
二.功能操作
1.重新索引
比如时间序列需要严格的一些排序,那么就有必要进行重新索引。Reindex会根据新索引进行重新排序,没有的索引会使用NaN来提点,如:
>>> obj=Series([4,5,6,7],index=['d','b','a','c']) >>> obj d 4 b 5 a 6 c 7 dtype: int64 >>> obj2=obj.reindex(['a','b','c','d','e']) >>> obj2 a 6.0 b 5.0 c 7.0 d 4.0 e NaN dtype: float64 |
利用reindex,对于不存在对应index的缺省值,也可以使用很多方法来填充,如:
>>> obj3=Series(['blue','yewllo','red'],index=[0,2,4]) >>> obj3 0 blue 2 yewllo 4 red dtype: object >>> obj3.reindex(range(6)) 0 blue 1 NaN 2 yewllo 3 NaN 4 red 5 NaN dtype: object >>> obj3.reindex(range(6),method='ffill') 0 blue 1 blue 2 yewllo 3 yewllo 4 red 5 red dtype: object |
红色就代表使用ffill(或者pad)进行前向填充,同理还有bfill或者backfll后向填充。
同理,DataFrame也能使用reindex来进行重新索引,默认是操作行索引,使用columns来操作列索引,如:
>>> df=DataFrame(np.arange(9).reshape(3,3),index=['a','c','d'],columns=['china','usa','england']) >>> df china usa england a 0 1 2 c 3 4 5 d 6 7 8 >>> df2=df.reindex(['a','b','c','d']) >>> df2 china usa england a 0.0 1.0 2.0 b NaN NaN NaN c 3.0 4.0 5.0 d 6.0 7.0 8.0 >>> df3=df.reindex(columns=['usa','china','england','german']) >>> df3 usa china england german a 1 0 2 NaN c 4 3 5 NaN d 7 6 8 NaN |
当然也能同时操作行以及列,如:
>>> df3=df.reindex(index=['a','b','c','d'],columns=['usa','china','england','german'],method="backfill") >>> df3 usa china england german a 1 0 2 NaN b 4 3 5 NaN c 4 3 5 NaN d 7 6 8 NaN |
2.抛弃轴项
使用drop方法可以抛弃某行或者某列项,默认删除行,如:
>>> df3.drop('a') usa china england german b 4 3 5 NaN c 4 3 5 NaN d 7 6 8 NaN |
使用axis=1来操作列,如:
>>> df3.drop(['china','german'],axis=1) usa england a 1 2 b 4 5 c 4 5 d 7 8 |
3.算术以及对齐
可以对不同索引之间的数据进行运算,如果存在不同的索引时,结果就是并集,同时默认使用NaN来填充,如:
>>> s1=Series([1,3,5,7,9],index=['a','b','c','d','e']) >>> s2=Series([2,4,6,8,10],index=['a','b','g','d','h']) >>> s1+s2 a 3.0 b 7.0 c NaN d 15.0 e NaN g NaN h NaN dtype: float64 |
4.汇总和计算描述统计
DataFrame默认是针对列来进行汇总计算,如:
>>> df china usa england a 0 1 2 c 3 4 5 d 6 7 8 >>> df.sum() china 9 usa 12 england 15 dtype: int64 >>> df.mean() china 3.0 usa 4.0 england 5.0 dtype: float64 >>> df.max() china 6 usa 7 england 8 dtype: int32 |
可以使用axis=1参数来操作行,如:
>>> df.sum(axis=1) a 3 c 12 d 21 dtype: int64 |
除了以上举例的sum总和,mean均值,max最大值之外,还包括如下几种主流的汇总函数:
Count(排除NA之外的数量),describe(汇总描述,包括sum,mean,max,min等等),quantile(分位数),median(中位数),var(方差),std(标准差),skew(偏度),kurt(峰度)。
三.缺失值处理
Pandas使用NaN(not a number)来表示缺失值,只是一种标记。使用numpy的nan来生成,如:
>>> np.nan nan |
使用isnull来判断是否是缺失值,返回True或者False,如:
>>> df china usa england a 0 1 2 c 3 4 5 d 6 7 8 >>> df.isnull() china usa england a False False False c False False False d False False False |
Series使用dropna来抛弃掉缺失值,如:
>>> s2=s1.reindex(['a','e','f','b','d','c']) >>> s2 a 1.0 e 9.0 f NaN(被drop掉) b 3.0 d 7.0 c 5.0 dtype: float64 >>> s2.dropna() a 1.0 e 9.0 b 3.0 d 7.0 c 5.0 dtype: float64 |
DataFrame使用how=‘all’参数来删除行全部为NaN的行,如:
>>> df2 china england german england a 0.0 2.0 NaN 2.0 b NaN NaN NaN NaN(被drop掉) c 3.0 5.0 NaN 5.0 d 6.0 8.0 NaN 8.0 >>> df2.dropna(how='all') china england german england a 0.0 2.0 NaN 2.0 c 3.0 5.0 NaN 5.0 d 6.0 8.0 NaN 8.0 |
使用axis=1来控制列,如:
>>> df2.dropna(how='all',axis=1) china england england a 0.0 2.0 2.0 b NaN NaN NaN c 3.0 5.0 5.0 d 6.0 8.0 8.0 |
如果不想丢弃掉缺失值,可以使用fillna()函数来填充。如:
>>> df3.fillna(1) china garman usa england british iceland swiss italy france a 0.0 1.0 1.0 2.0 1.0 1.0 1.0 1.0 1.0 b 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 c 3.0 1.0 4.0 5.0 1.0 1.0 1.0 1.0 1.0 d 6.0 1.0 7.0 8.0 1.0 1.0 1.0 1.0 1.0 e 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 f 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 g 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 |
也可以使用method来控制填充内容,如:
>>> df3.fillna(method='ffill') china garman usa england british iceland swiss italy france a 0.0 NaN 1.0 2.0 NaN NaN NaN NaN NaN b 0.0 NaN 1.0 2.0 NaN NaN NaN NaN NaN c 3.0 NaN 4.0 5.0 NaN NaN NaN NaN NaN d 6.0 NaN 7.0 8.0 NaN NaN NaN NaN NaN e 6.0 NaN 7.0 8.0 NaN NaN NaN NaN NaN f 6.0 NaN 7.0 8.0 NaN NaN NaN NaN NaN g 6.0 NaN 7.0 8.0 NaN NaN NaN NaN NaN |
使用其他值来填充,如平均值:
>>> df3.fillna(df['usa'].mean()) china garman usa england british iceland swiss italy france a 0.0 4.0 1.0 2.0 4.0 4.0 4.0 4.0 4.0 b 4.0 4.0 4.0 4.0 4.0 4.0 4.0 4.0 4.0 c 3.0 4.0 4.0 5.0 4.0 4.0 4.0 4.0 4.0 d 6.0 4.0 7.0 8.0 4.0 4.0 4.0 4.0 4.0 e 4.0 4.0 4.0 4.0 4.0 4.0 4.0 4.0 4.0 f 4.0 4.0 4.0 4.0 4.0 4.0 4.0 4.0 4.0 g 4.0 4.0 4.0 4.0 4.0 4.0 4.0 4.0 4.0 |