本节我们主要介绍pandas对象series和dataframe当中的一些重要的方法
reindex方法
reindex方法会根据index对series和dataframe进行重排序,对于找不到的index会用NAN值进行填充。
In [151]: obj Out[151]: d 4.5 b 7.2 a -5.3 c 3.6 dtype: float64 In [152]: f Out[152]: state year pop 0 Ohio 2000 1.5 1 Ohio 2001 1.7 2 Ohio 2002 3.6 3 Nevada 2001 2.4 4 Nevada 2002 2.9 5 Nevada 2003 3.2 In [153]: f.reindex([0,2,1,3,4,5]) Out[153]: state year pop 0 Ohio 2000 1.5 2 Ohio 2002 3.6 1 Ohio 2001 1.7 3 Nevada 2001 2.4 4 Nevada 2002 2.9 5 Nevada 2003 3.2 In [154]: f.reindex([0,2,1,3,4,5,6]) Out[154]: state year pop 0 Ohio 2000.0 1.5 2 Ohio 2002.0 3.6 1 Ohio 2001.0 1.7 3 Nevada 2001.0 2.4 4 Nevada 2002.0 2.9 5 Nevada 2003.0 3.2 6 NaN NaN NaN
对于dataframe而言reindex函数除了能够根据index重新排列行以外,也能够对列进行重新排序。
In [156]: f.reindex(columns=['year','state','pop']) Out[156]: year state pop 0 2000 Ohio 1.5 1 2001 Ohio 1.7 2 2002 Ohio 3.6 3 2001 Nevada 2.4 4 2002 Nevada 2.9 5 2003 Nevada 3.2 In [157]: f.reindex(columns=['year','state','pop','not exist']) Out[157]: year state pop not exist 0 2000 Ohio 1.5 NaN 1 2001 Ohio 1.7 NaN 2 2002 Ohio 3.6 NaN 3 2001 Nevada 2.4 NaN 4 2002 Nevada 2.9 NaN 5 2003 Nevada 3.2 NaN
在重新排列时,当你想要完成一些插值操作时可以使用类似method选项完成,例如ffill实现向前填充,即reindex的行或列不存在时,本身是需要按照NAN值填充,method=ffill方法可以将其按照前一行或列进行填充。
In [158]: obj3 = pd.Series(['blue', 'purple', 'yellow'], index=[0 ...: , 2, 4]) In [159]: obj3 Out[159]: 0 blue 2 purple 4 yellow dtype: object In [160]: obj3.reindex(range(6), method='ffill') Out[160]: 0 blue 1 blue 2 purple 3 purple 4 yellow 5 yellow dtype: object
下表是reindex函数所能使用的参数:
Drop方法
丢弃指定轴上的项,丢弃某条轴上的一个或多个项。drop方法会返回一个在指定轴上删除了指定值的新对象。
In [162]: f Out[162]: state year pop 0 Ohio 2000 1.5 1 Ohio 2001 1.7 2 Ohio 2002 3.6 3 Nevada 2001 2.4 4 Nevada 2002 2.9 5 Nevada 2003 3.2 In [163]: f.drop(0) Out[163]: state year pop 1 Ohio 2001 1.7 2 Ohio 2002 3.6 3 Nevada 2001 2.4 4 Nevada 2002 2.9 5 Nevada 2003 3.2 In [165]: f.drop([1,2]) Out[165]: state year pop 0 Ohio 2000 1.5 3 Nevada 2001 2.4 4 Nevada 2002 2.9 5 Nevada 2003 3.2
通过传递axis=1或者是axis='columns'可以删除列的值
In [167]: f.drop(['state'],axis=1) Out[167]: year pop 0 2000 1.5 1 2001 1.7 2 2002 3.6 3 2001 2.4 4 2002 2.9 5 2003 3.2 In [168]: f Out[168]: state year pop 0 Ohio 2000 1.5 1 Ohio 2001 1.7 2 Ohio 2002 3.6 3 Nevada 2001 2.4 4 Nevada 2002 2.9 5 Nevada 2003 3.2 In [169]: f.drop(['state'],axis='columns') Out[169]: year pop 0 2000 1.5 1 2001 1.7 2 2002 3.6 3 2001 2.4 4 2002 2.9 5 2003 3.2
inplace,pandas提供的很多函数都提供了这个参数,当inplace置为true时意思是对这个dataframe进行原地操作(即对当前的dataframe进行操作,不去返还一个新的对象)。
索引
本节我们将讨论pandas对象series和dataframe的索引。
获取dataframe当中的列或者行
访问columns时,可以使用df['year] 也可以使用df.year,当然在使用df.column时,只能使用df当中存在的列名
In [99]: frame['year'] Out[99]: num one 2000 two 2001 three 2002 four 2001 five 2002 six 2003 Name: year, dtype: int64 In [100]: frame.year Out[100]: num one 2000 two 2001 three 2002 four 2001 five 2002 six 2003 Name: year, dtype: int64
dataframe当中选取行需要采用loc,同时当我们同时选取行与列的某个数据时,也需要采用loc,用法有两种frame.loc['index','column']或者frame.loc['index']['column']
In [103]: frame Out[103]: column_name year state pop num one 2000 Ohio 1.5 two 2001 Ohio 1.7 three 2002 Ohio 3.6 four 2001 Nevada 2.4 five 2002 Nevada 2.9 six 2003 Nevada 3.2 In [104]: frame.loc['one'] Out[104]: column_name year 2000 state Ohio pop 1.5 Name: one, dtype: object In [105]: frame.loc['one','pop'] Out[105]: 1.5 In [106]: frame.loc['one']['pop'] Out[106]: 1.5
当然也可以使用loc选取列,思路是选取所有的行,从中再选取列
In [107]: frame.loc[:,'pop'] Out[107]: num one 1.5 two 1.7 three 3.6 four 2.4 five 2.9 six 3.2 Name: pop, dtype: float64
在此再次总结一下,单纯的选取一列可以使用df[columns],选取行时需要采用df.loc[index],在混合选取时也需要使用df.loc[index][column]的方式(也可以缩写为df.loc[index,column]的形式),同时选取列也可以使用df.loc[:][oc[:][column]的方式进行选择。
数字索引
除了上面提到的标签索引以外,同时pandas还提供了标签索引,对于dataframe当中的行与列索引,可以使用标签或者数字索引,标签索引与数字索引最大的区别是,数字索引遵循python当中的索引规则,包上不包下,而标签索引是包上又包下
In [25]: data Out[25]: one two three four Ohio 0 1 2 3 Colorado 4 5 6 7 Utah 8 9 10 11 New York 12 13 14 15 In [23]: data.iloc[1:3] Out[23]: one two three four Colorado 4 5 6 7 Utah 8 9 10 11 In [24]: data.loc['Ohio':'Utah'] Out[24]: one two three four Ohio 0 1 2 3 Colorado 4 5 6 7 Utah 8 9 10 11
连接方法concat,append
将两个dataframe和series连接起来有两种方式,concat和append,这两者的区别如下:
append
dataframe的append方法仅能将一个dataframe 按照行的方式添加即axis=0,而且在append之后不会产生一个新的对象
In [107]: df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB')) In [108]: df Out[108]: A B 0 1 2 1 3 4 In [109]: df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB')) In [110]: df.append(df2) Out[110]: A B 0 1 2 1 3 4 0 5 6 1 7 8
concat
concat方法比append方法提供更多的参数,不仅可以在行的基础上进行连接,同时也可以在列的纬度进行连接,同时在链接时还提供了 inner join的方法
In [122]: pd.concat([df,df2]) Out[122]: A B 0 1 2 1 3 4 0 5 6 1 7 8
在axis=1(列链接)
In [125]: pd.concat([df,df2],axis=1) Out[125]: A B A B 0 1 2 5 6 1 3 4 7 8
继续以这两个dataframe为例,首先加上一行。
In [128]: df.loc[2]=[10,11] In [129]: df Out[129]: A B 0 1 2 1 3 4 2 10 11
按列链接
In [127]: df2
Out[127]:
A B
0 5 6
1 7 8
In [130]: pd.concat([df,df2],axis=1) Out[130]: A B A B 0 1 2 5.0 6.0 1 3 4 7.0 8.0 2 10 11 NaN NaN
inner join的方法
当按列进行连接时,只合并那些index相同的
In [132]: pd.concat([df,df2],axis=1,join='inner') Out[132]: A B A B 0 1 2 5 6 1 3 4 7 8
按行进行连接时,只合并那些column相同的
In [137]: df['C']=[12,13,14] In [138]: df Out[138]: A B C 0 1 2 12 1 3 4 13 2 10 11 14 In [139]: pd.concat([df,df2],join='inner') Out[139]: A B 0 1 2 1 3 4 2 10 11 0 5 6 1 7 8 In [140]: pd.concat([df,df2]) Out[140]: A B C 0 1 2 12.0 1 3 4 13.0 2 10 11 14.0 0 5 6 NaN 1 7 8 NaN