我在df中有两列,有时一列中都有NaN,有时两列中都含有NaN。如果存在任一列值,我想用相同的值填充NaN。
例如, 输入:
col1 col2
0 3.375000 4.075000
1 2.450000 1.567100
2 NaN NaN
3 3.248083 NaN
4 NaN 2.335725
5 2.150000 3.218750
输出:
col1 col2
0 3.375000 4.075000
1 2.450000 1.567100
2 NaN NaN
3 3.248083 3.248083
4 2.335725 2.335725
5 2.150000 3.218750
为此,我尝试过
print df.T.fillna(method='bfill').fillna(method='ffill').T
以上内容为我提供了必需的结果,但是我想为我的代码添加了更多的复杂性。还有其他更好的方法吗?
答案 0 :(得分:4)
您不必转置,您可以指定一个轴:
df.ffill(1).bfill(1)
col1 col2
0 3.375000 4.075000
1 2.450000 1.567100
2 NaN NaN
3 3.248083 3.248083
4 2.335725 2.335725
5 2.150000 3.218750
如果您有多列,但不想触及其中的一部分,则可以切片,填充和分配回来。
df
col1 col2 col3
0 3.375000 4.075000 NaN
1 2.450000 1.567100 2.0
2 NaN NaN 3.0
3 3.248083 NaN 5.0
4 NaN 2.335725 NaN
5 2.150000 3.218750 5.0
include = ['col1', 'col2']
# Or,
# exclude = ['col3']
# include = df.columns.difference(exclude)
df[include] = df[include].ffill(1).bfill(1)
df
col1 col2 col3
0 3.375000 4.075000 NaN
1 2.450000 1.567100 2.0
2 NaN NaN 3.0
3 3.248083 3.248083 5.0
4 2.335725 2.335725 NaN
5 2.150000 3.218750 5.0
如果只有两列,则也可以使用combine_first
。
df.col1 = df.col1.combine_first(df.col2)
df.col2 = df.col2.combine_first(df.col1)
col1 col2
0 3.375000 4.075000
1 2.450000 1.567100
2 NaN NaN
3 3.248083 3.248083
4 2.335725 2.335725
5 2.150000 3.218750