Pandas的基本功能(一)
重新索引
Pandas对象含有一个重要的函数——reindex()函数,其作用是创建一个适应新索引的新对象。reindex()函数可对Series和DataFrame对象进行重新索引,接下来详细讲解。
对Series对象重新索引
具体示例如下所示:
In [26]: from pandas import Series,DataFrame
In [27]: se1 = Series([2.4,4.0,3.5,-6.2],index = ['b','a','c','d'])
In [28]: se2 = se1.reindex(['a','b','c','d','e','f'])
上述代码是对Series对象重新索引,其中In [27]是创建Series对象,并将其赋值给变量se1;In [28]是对se1对象重新索引,并将重新索引后的结果赋值给变量se2。各变量的运行结果如下所示:
In [29]: se1
Out[29]:
b 2.4
a 4.0
c 3.5
d -6.2
dtype: float64
In [30]: se2
Out[30]:
a 4.0
b 2.4
c 3.5
d -6.2
e NaN
f NaN
dtype: float64
从上述运行结果可看出,se2对象是se1对象重新索引的结果,并且新索引值“e”、“f”对应的值是缺失值NaN,即调用Series的reindex()函数将会根据新设置的索引值进行重排,若某个索引值当前不存在时,则会引入缺失值来填充。
在重新设置索引时,可能会存在缺失值的情况,reindex()函数中的method属性可在重新索引时选择插入值的处理方式,具体示例如下所示:
In [34]: from pandas import Series,DataFrame
In [35]: se1 = Series(['北京','上海','深圳'],index = [0,2,4])
In [36]: se2 = se1.reindex(range(6),method = 'ffill')
上述代码是对Series对象重新索引时选择插入值,其中In [36]是对se1对象重新索引,并指定缺失值前向填充,并将处理后的结果赋值给变量se2。各变量的运行结果如下所示:
In [37]: se1
Out[37]:
0 北京
2 上海
4 深圳
dtype: object
In [38]: se2
Out[38]:
0 北京
1 北京
2 上海
3 上海
4 深圳
5 深圳
dtype: object
从上述运行结果可看出,se2对象是se1对象重新索引的结果,并且新索引值“1”、“3”、“5”实现前向填充,即指定method属性值为“ffill”,使新索引所对应值填充上一元素的值。可用的method选项除了“ffill”,还有后向填充“bfill”,具体如表4.4所示。
选项值 | 说明 |
---|---|
ffill或pad | 前向填充(或搬运)值 |
bfill或backfill | 后向填充(或搬运)值 |
对DataFrame对象重新索引
对于DataFrame对象,reindex()函数既可以修改行索引,也可以修改列索引,而且可同时修改行列索引。具体示例如下所示:
In [39]: from pandas import Series,DataFrame
In [40]: import numpy as np
In [41]: ndarr = np.arange(9).reshape(3,3)
In [42]: ind = ['a','c','d']
In [43]: col = ['one','two','three']
In [44]: f1 = DataFrame(ndarr,index = ind,columns = col)
In [45]: f2 = f1.reindex(['a','b','c','d'])
In [46]: f3 = f1.reindex(index = ['a','b','c','d'],
...: columns = ['one','two','three','four'])
上述代码是对DataFrame对象重新索引,其中In [41]是创建一个3×3的数组,并将其赋值给变量ndarr;In [42]是创建一个列表作为DataFrame对象的行索引值,并将其赋值给变量ind;In [43]是创建一个列表作为DataFrame对象的列索引值,并将其赋值给变量col;In [44]是创建DataFrame对象,并将其赋值给变量f1;In [45]是对f1对象的行重新索引,并将重新索引之后的结果赋值给变量f2;In [46]是对f1对象的行和列均重新索引,并将重新索引之后的结果赋值给变量f3。各变量的运行结果如下所示:
In [47]: f1
Out[47]:
one two three
a 0 1 2
c 3 4 5
d 6 7 8
In [48]: f2
Out[48]:
one two three
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
In [49]: f3
Out[49]:
one two three four
a 0.0 1.0 2.0 NaN
b NaN NaN NaN NaN
c 3.0 4.0 5.0 NaN
d 6.0 7.0 8.0 NaN
从上述运行结果可看出,当存在新索引时,会以缺失值填充。当然,可以指定fill_value参数来替代缺失值,具体示例如下所示:
In [50]: f3 = f1.reindex(index = ['a','b','c','d'],
...: columns = ['one','two','three','four'],fill_value = 10)
上述代码是对f1对象的行和列均重新索引,并将所有的缺失值替换为10,最后将重新索引之后的结果赋值给变量f3,修改之后的f3运行结果如下所示:
In [51]: f3
Out[51]:
one two three four
a 0 1 2 10
b 10 10 10 10
c 3 4 5 10
d 6 7 8 10
从上述运行结果可看出,之前f3对象中的缺失值都被替换成了10。
reindex函数还有很多其他的参数,每个参数都有特殊的功用,具体如表4.5所示。
参数 | 说明 |
---|---|
index | 用作索引的新序列,既可是Index实例,也可是其他序列的Python数据结构,Index会被完全使用,如未复制一般 |
method | 填充方式,具体参数参见表4.4 |
fill_value | 在重新索引的过程中,需要引入缺失值时使用的替代值 |
limit | 前向或或后向填充时的最大填充量 |
level | 在MultiIndex的指定级别上匹配简单索引,否则选择其子集 |
copy | 默认为True,无论如何都复制;若为False,则新旧相等就不复制 |