针对特定列的逐行fillna?

6
我有一个以下的Pandas数据帧,我想以逐行方式使用列D中的值来填写列A-C中的NaN。是否有明确的方法可以定义所有NaN应该逐行依赖于列D的值?我无法在fillna()中找到明确的方法。
请注意,还有其他的E-Z列,它们有自己的NaN并且可能具有填充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个回答

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(当它是一个dataframe时,它会尝试将不同的填充值映射到不同的列而不是行)。因此,通过逐列执行apply操作,它可以工作:

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

谢谢,这很有道理。但是是否有一种方法可以通过明确定义其他NaN列应从哪一列获取其值来实现呢?例如,如果列'E'和'F'也有NaN,并且我还想要它们按行用来自列'D'的值进行填充?在某种意义上,这将使填充逻辑独立于列顺序。 - wfh
“D”列并不总是像你的例子中那样恒定不变吗?如果是这种情况,当然可以更简单地解决。 - joris
没错,它不是常量 - 我应该选择一个更好/不那么琐碎的例子。感谢您的帮助! - wfh

1

你也可以使用以下代码

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接