本节我们主要介绍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
12-20 05:54