pandas reindex 方法
admin
2024-04-12 05:52:54

pandas.Series.reindex

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

import pandas as pd
import numpy as nps1 = 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, 2nd^{\rm nd}nd edition. Wes McKinney.

相关内容

热门资讯

宝鸡旅行社哪家强?2025年最... 随着旅游市场的全面复苏,宝鸡作为历史文化名城吸引了大量游客。然而,面对众多旅行社,游客常常陷入选择困...
带娃住敦煌沙漠帐篷,晚上真的会... 每当有家长咨询“带孩子住沙漠帐篷会不会冷”这个问题时,我眼前总会浮现出去年五月那个特别的夜晚——我们...
山东省旅游饭店行业从业人员服务... 齐鲁晚报·齐鲁壹点 吴昊 11月19日,山东省“技能兴鲁”职业技能大赛——第八届山东省旅游饭店行业从...
恩施这片神秘土地,相信每一个人... "真希望有机会还能再次来到恩施"——这句话道出了多少人的心声!恩施就像一位蒙着面纱的土家姑娘,初见惊...
陆毅一家四口都江堰游玩,夫妻牵... 陆毅一家四口最近在都江堰被网友偶遇,两个女儿穿着同款粉色衣服,手拉手走着,看起来特别温馨。 两个孩子...