按行根据特定列填充缺失值?
我有一个 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