在两个列中填写NaN或两个值

时间:2018-12-18 07:01:09

标签: python pandas

我在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

以上内容为我提供了必需的结果,但是我想为我的代码添加了更多的复杂性。还有其他更好的方法吗?

1 个答案:

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