针对特定列的逐行fillna?

时间:2014-06-03 12:37:53

标签: python pandas missing-data

我有以下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     ...  

感谢。

2 个答案:

答案 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()