本文共 2705 字,大约阅读时间需要 9 分钟。
参考文档:
DataFrame.reindex(index=None, columns=None, **kwargs)
reindex 函数的参数参数 | 说明 |
---|---|
method | 插值填充方法 |
fill_value | 引入的缺失数据值 |
limit | 填充间隙 |
copy | 如果新索引与就的相等则底层数据不会拷贝。默认为True(即始终拷贝) |
level | 在多层索引上匹配简单索引 |
pandas的reindex对象,是数据符合新的索引来构造一个新的对象
import pandas as pdobj = pd.Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])objd 4.5b 7.2a -5.3c 3.6dtype: float64
Series的reindex使它符合新的索引,如果索引的值不存在就填入缺失值
obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'])obj2a -5.3b 7.2c 3.6d 4.5e NaNdtype: float64
obj.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=0)a -5.3b 7.2c 3.6d 4.5e 0.0dtype: float64
method选项来控制填充值或内插值:
method : {None, ‘backfill’/’bfill’, ‘pad’/’ffill’, ‘nearest’}, optional。 ffill/pad 向前或进位填充,bfill/backfill 向后或进位填充obj3 = pd.Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])obj3.reindex(range(6), method='ffill')0 blue1 blue2 purple3 purple4 yellow5 yellowdtype: object
向后填充
obj3.reindex(range(6), method='bfill')0 blue1 purple2 purple3 yellow4 yellow5 NaNdtype: object
对于DataFrame, reindex 可以改变(行)索引,列或两者。当只传入一个序列时,结果中的行被重新索引:
frame = pd.DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'],columns=['Ohio', 'Texas', 'California'])frame Ohio Texas Californiaa 0 1 2c 3 4 5d 6 7 8
frame2 = frame.reindex(['a', 'b', 'c', 'd'])frame2 Ohio Texas Californiaa 0.0 1.0 2.0b NaN NaN NaNc 3.0 4.0 5.0d 6.0 7.0 8.0
使用column可以将列进行重新索引
states = ['Texas', 'Utah', 'California']frame.reindex(columns=states) Texas Utah Californiaa 1 NaN 2c 4 NaN 5d 7 NaN 8
此时的frame依然是原样
frame Ohio Texas Californiaa 0 1 2c 3 4 5d 6 7 8
也可以同时读列和index进行reindex,可是插值只在行侧
frame.reindex(index=['a', 'b', 'c', 'd'], method='ffill',columns=states) Texas Utah Californiaa 1 NaN 2b 1 NaN 2c 4 NaN 5d 7 NaN 8
关于level可能大家不太理解。level主要在多层索引上用到。举例:
继续之前的话题,我想看到新生儿名字中最后一位字母的变化.get_last_letter=lambda x:x[-1]last_letters=names.name.map(get_last_letter)last_letters.name='last_letter'table=pd.pivot_table(names,index=[last_letters],values='births',columns=['sex','year'],aggfunc=sum)table
比如我想看其中三年的数据,改怎么办。
按照之前的做法,需要table[‘column name’],但是你会发现table[‘F’]或者table[‘M’]还行,但是还有一层column可怎么办。
正确做法如下:subtable=table.reindex(columns=[1910,1960,2010],level='year')subtable
请细细体会。
subtable.indexIndex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'], dtype='object', name='last_letter')In [7]:
subtable.columnsMultiIndex(levels=[['F', 'M'], [1910, 1960, 2010]], labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]], names=['sex', 'year'])
下一章讲MultiIndex