首页 > 解决方案 > 如何根据行数据有选择地在 Pandas df 中使用 ffill

问题描述

我正在尝试用前面的条目填充 Pandas df 中的列,但并非该列中的所有单元格都需要该条目 - 实际上需要不同的条目。例如:

原df:

    OAS     CLASS2  CLASS3  CLASS4  Ticker
0   240.59  NaN     NaN     NaN     Total
1   269.72  Fins    NaN     NaN     Fins
2   251.88  Fins    Banking Banking Banking
3   234.44  Fins    NaN     NaN     ACAFP
4   195.80  Fins    NaN     NaN     ACHMEA
5   288.63  Fins    Insur   NaN     Insur
6   313.79  Fins    Insur   Life    Life
7   425.27  Fins    Insur   Life    ACAFP
8   304.39  Fins    NaN     NaN     AEGON

代码:

df2 = df.fillna(method='ffill')
df2

    OAS     CLASS2  CLASS3  CLASS4  Ticker
0   240.59  NaN     NaN     NaN     Total
1   269.72  Fins    NaN     NaN     Fins
2   251.88  Fins    Banking Banking Banking
3   234.44  Fins    Banking Banking ACAFP
4   195.80  Fins    Banking Banking ACHMEA
5   288.63  Fins    Insur   Banking Insur
6   313.79  Fins    Insur   Life    Life
7   425.27  Fins    Insur   Life    ACAFP
8   304.39  Fins    Insur   Life    AEGON

问题出在第 5 行,其中 CLASS4 列单元格现在显示 Banking 而不是 NaN,但应该按照左右相邻列显示“Insur”。我意识到我的代码根本没有试图纠正这个问题,但我只是不知道从哪里开始。

标签: python-3.xpandas

解决方案


ffill方法向前fillna()传播最后观察到的非空值,直到遇到另一个非空值。

因此,在您的情况下发生的情况是,在 CLASS4 中观察到值Banking并将其传播到所有 NaN 值,直到在此列中遇到另一个非空值。

因此,为了用左侧的值填充 NaN,您必须为您的方法提供axis=1参数。fillna()

执行以下操作:

df2 = df.fillna(method='ffill', axis=1)
df2

将导致这样的事情:

0   0   240.59  240.59  240.59  240.59  Total
1   1   269.72  Fins    Fins    Fins    Fins
2   2   251.88  Fins    Banking Banking Banking
3   3   234.44  Fins    Fins    Fins    ACAFP
4   4   195.8   Fins    Fins    Fins    ACHMEA
5   5   288.63  Fins    Insur   Insur   Insur
6   6   313.79  Fins    Insur   Life    Life
7   7   425.27  Fins    Insur   Life    ACAFP
8   8   304.39  Fins    Fins    Fins    AEGON

推荐阅读