按行根据特定列填充缺失值?

6 投票
2 回答
18283 浏览
提问于 2025-04-18 08:24

我有一个 pandas 数据框,想要把 A 到 C 列中的 NaN 值用 D 列的值来填充,而且是按行来填充。有没有什么明确的方法可以做到这一点,让所有的 NaN 值都依赖于 D 列的值?我在 fillna() 中找不到这种明确的做法。

需要注意的是,还有其他的 E-Z 列,它们也有自己的 NaN 值,并且可能有其他的填充规则,所以这些列 不应该被修改

A        B        C        D       E
158      158      158      177     ...  
158      158      158      177     ...
NaN      NaN      NaN      177     ...   
158      158      158      177     ...
NaN      NaN      NaN      177     ...  

我只想对 A-C 列进行这样的操作:

A        B        C        D       E
158      158      158      177     ...  
158      158      158      177     ...
177      177      177      177     ...   
158      158      158      177     ...
177      177      177      177     ...  

谢谢。

2 个回答

1

你也可以使用下面的代码

cols = ['A', 'B', 'C', 'D']
df.loc[:,cols] = df.loc[:,cols].bfill()
9

使用 fillna 函数:

df.fillna(axis=1, method='backfill')

如果其他列没有 NaN(缺失值),这样做就可以了。
但是如果有 NaN,并且你想保留它们不变,我觉得唯一的办法就是在你的数据框的一个子集上使用 fillna。下面是一个示例数据框:

In [45]: df
Out[45]: 
     A    B    C    D   E   F
0  158  158  158  177   1  10
1  158  158  158  177   2  20
2  NaN  NaN  NaN  177   3  30
3  158  158  158  177 NaN  40
4  NaN  NaN  NaN  177   5  50

In [48]: df[['A', 'B', 'C', 'D']] = df[['A', 'B', 'C', 'D']].fillna(axis=1, method='backfill')

In [49]: df
Out[49]: 
     A    B    C    D   E   F
0  158  158  158  177   1  10
1  158  158  158  177   2  20
2  177  177  177  177   3  30
3  158  158  158  177 NaN  40
4  177  177  177  177   5  50

更新:如果你不想依赖列的顺序,你也可以为每一行指定要用来填充的值(比如 .fillna(value=df['D'])。唯一的问题是,这种方法只适用于 Series(当是数据框时,它会尝试将不同的填充值映射到不同的列,而不是行)。所以通过逐列应用的方法,这样就可以实现:

In [60]: df[['A', 'B', 'C']].apply(lambda x: x.fillna(value=df['D']))
Out[60]: 
     A    B    C
0  158  158  158
1  158  158  158
2  177  177  177
3  158  158  158
4  177  177  177

撰写回答