我有以下pandas数据帧,我想用列D中的值以行方式填充AC列中的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 ...
感谢。
答案 0 :(得分:4)
使用fillna
功能:
df.fillna(axis=1, method='backfill')
如果其他列中没有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
Udate:如果您不想依赖列顺序,还可以指定用于填充每一行的值(例如.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
答案 1 :(得分:0)
您也可以使用以下代码
cols = ['A', 'B', 'C', 'D']
df.loc[:,cols] = df.loc[:,cols].bfill()