首页 > pandas 阅读数:30

pandas reindex重新索引

reindex 是 pandas 对象的一个重要方法,其作用是创建一个适应新索引的新对象。

例如:定义一个 Series 对象为 se1=pd.Series([1,4,-1,2],index=['a','e','d','c']),现在调用 Series 对象的重新索引 se1.reindex(['a','b','c','d','e']),此时,se1 中的元素将会根据新索引进行重排,如果某个索引值当前不存在,就引入缺失值 NaN,其示例代码如下:
In [37]:  se1 = pd.Series([1,4,-1,2],index=['a','e','d','c'])
In [38]:  se1.reindex(['a','b','c','d','e'])
Out[38]:  a     1.0
          b     NaN
          c     2.0
          d    -1.0
          e     4.0
          dtype: float64

如果是类似于时间序列的有序数据,重新索引时可能需要做一些插值处理。在 reindex() 函数中,参数 method 就是说明插值填充方式的。reindex() 函数的格式如下:

obj.reindex(index[,method [,columns[,fill_value[,limit[,level[,copy]]]]]])

函数中的参数说明如下:
  • obj:pandas 对象名称;
  • index:用作索引的新序列。既可以是 Index 实例,也可以是其他序列型的 Python 数据结构。Index 会被完全使用,就像没有任何复制一样;
  • method:插值填充方式,ffill 或 .pad 表示向前填充(或搬运)值,bfill 或 backfill 表示向后填充(或搬运)值;
  • fill_value:在重新索引过程中,需要引入缺失值时使用的替代值;
  • limit:向前或向后填充时的最大填充量;
  • level:在 MultiIndex 的指定级别上匹配简单索引,否则选取其子集;
  • copy:默认为 True,表示无论如何都复制。如果为 False,则表示新旧相等就不复制。

【例 1】利用 reindex() 函数重新定义 Series 和 DataFrame 的索引及顺序。其程序代码 test1.py 如下。
# -*- coding: utf-8 -*-
import numpy as np
from pandas import DataFrame,Series
print ('重新指定索引及顺序')
se1 = Series([2.1, 4.3, -1.6], index = ['c', 'e', 'a'])
print (se1)
# 指定不存在元素的默认值为0
print (se1.reindex(['a', 'b', 'c', 'd', 'e'], fill_value = 0))
print ('重新指定索引,并指定填充元素的方法')
se2 = Series(['20170101', '20170102', '20170104'], index = [0, 2, 4])
print (se2.reindex(range(6), method = 'ffill'))
print ('对DataFrame重新指定索引')
df1 = DataFrame(np.arange(12).reshape(3, 4),index = ['a', 'c', 'd'],
                columns = ['item1', 'item2', 'item3','item4'])
print (df1)
# 指定不存在元素的默认值为0
df2 = df1.reindex(['a', 'b', 'c', 'd'],fill_value = 0)
print (df2)
print ('重新指定column')
states = ['col1', 'item2', 'item3']
print (df1.reindex(columns = states))

print ('对DataFrame重新指定索引,并指定填充元素的方法')
print (df1.reindex(index = ['a', 'b', 'c', 'd'],method = 'ffill',
                   columns = states))