Pandas

Pandas的基本功能(一)

2018-11-14  本文已影响1人  5f2a6061653d

重新索引

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,则新旧相等就不复制
上一篇下一篇

猜你喜欢

热点阅读