pandas reindex 方法

本文介绍了Pandas中Series和DataFrame的reindex方法,用于调整数据索引并处理缺失值。通过reindex,我们可以改变数据的行或列索引,同时可以选择填充方法如前向填充(ffill)、后向填充(bfill)或指定特定值。在示例中,展示了如何使用reindex填充NaN值,并解释了填充规则。此外,还展示了在时间序列数据上应用reindex的例子。

pandas.Series.reindex

reindex 方法会创建一个新对象,并根据给定的新 index 对原来 Series 的数据重新组织。如果新 index 中有原来 index 不存在的 label,那么这些 label 对应位置会被填充 NaN

import pandas as pd
import numpy as np

s1 = pd.Series([4.5, 7.2, 6.6, 5.8], index=['d', 'a', 'c', 'b'])
s1
"""
d    4.5
a    7.2
c    6.6
b    5.8
dtype: float64
"""
s2 = s1.reindex(['a', 'b', 'c', 'd', 'e'])
s2
"""
a    7.2
b    5.8
c    6.6
d    4.5
e    NaN
dtype: float64
"""

通常我们想对 NaN 的位置填充一些值,这可以通过 reindex 方法的 method 参数来实现。

method{None, ‘backfill’/’bfill’, ‘pad’/’ffill’, ‘nearest’}

pad/ffill:会将上一个非 NaN 的值填充到此位置;

backfill/bfill:会将下一个非 NaN 的值填充到此位置;

nearest:会将最靠近的非 NaN 的值填充到此位置

s3 = pd.Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])
s3
"""
0      blue
2    purple
4    yellow
dtype: object
"""
s3.reindex(range(6), method='ffill')
"""
0      blue
1      blue
2    purple
3    purple
4    yellow
5    yellow
dtype: object
"""

如果我们想要在 NaN 位置填充自己想要的值,可以传入 fill_value 参数:

s3.reindex(range(6), fill_value='red')
"""
0      blue
1       red
2    purple
3       red
4    yellow
5       red
dtype: object
"""

pandas.DataFrame.reindex

对于 DataFrame,reindex 方法既可以改变行标(index),也可以改变列标(column),或者两者同时改变。

df = pd.DataFrame(np.arange(9).reshape((3, 3)),
                     index=['a', 'c', 'd'],
                     columns=['BeiJ', 'ShangH', 'shenZ'])
print(df)
"""
   BeiJ  ShangH  shenZ
a     0       1      2
c     3       4      5
d     6       7      8
"""

如果 reindex 中只传入一个序列,那么默认会改变 index

df.reindex(['a', 'b', 'c', 'd'])
"""
   BeiJ  ShangH  shenZ
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
"""

如果想要改变列标,那么可以指定 columns 关键字:

df.reindex(columns=['BeiJ', 'XiA', 'shenZ'])
"""
   BeiJ  XiA  shenZ
a     0  NaN      2
c     3  NaN      5
d     6  NaN      8
"""

DataFrame 的 reindex 方法也有 methodfill_value 参数,含义与之前相同。

下面我们看这样一个例子:

date_index = pd.date_range('1/1/2023', periods=6, freq='D')
df = pd.DataFrame({"prices": [100, 101, np.nan, 100, 89, 88]},
                   index=date_index)
print(df)
"""
            prices
2023-01-01   100.0
2023-01-02   101.0
2023-01-03     NaN
2023-01-04   100.0
2023-01-05    89.0
2023-01-06    88.0
"""

df 进行扩充:

date_index2 = pd.date_range('12/29/2022', periods=10, freq='D')
df.reindex(date_index2)
"""
            prices
2022-12-29     NaN
2022-12-30     NaN
2022-12-31     NaN
2023-01-01   100.0
2023-01-02   101.0
2023-01-03     NaN
2023-01-04   100.0
2023-01-05    89.0
2023-01-06    88.0
2023-01-07     NaN
"""

如果使用 bfill 填充 NaN

df.reindex(date_index2, method='bfill')
"""
            prices
2022-12-29   100.0
2022-12-30   100.0
2022-12-31   100.0
2023-01-01   100.0
2023-01-02   101.0
2023-01-03     NaN
2023-01-04   100.0
2023-01-05    89.0
2023-01-06    88.0
2023-01-07     NaN
"""

注意到有两个 NaN 并没有被填充。最后一个 NaN 未被填充是因为它后面没有可供 bfill 来填充的值了。而中间的 NaN 则是因为原本的 df 该位置的值就为 NaNreindex 中的填充 method 不会对此进行填充。


References

[1] NumPy Reference. https://numpy.org/doc/stable/reference/index.html
[2] Python for Data Analysis, 2 n d ^{\rm nd} nd edition. Wes McKinney.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如松茂矣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值