我有一个带有两列A和B的pandas DataFrame,它们包含数值或NaN。如果数值出现在一列中,则另一列中的相应单元格将始终为NaN,例如:
A B
0 123 NaN
1 456 NaN
2 NaN 789
我想复制(或者,移动)A列中的任何非NaN值来覆盖B列中相应的NaN,例如:
A B
0 123 123
1 456 456
2 NaN 789
基于this reply我提出的类似问题:
mask = (df['A'] != np.nan)&(df['B'] == np.nan)
df['B'][mask] = df['A'][mask]
但这导致没有变化。谁能解释我哪里出错?
答案 0 :(得分:2)
您可以使用combine_first
或fillna
:
df.B = df.B.combine_first(df.A)
print (df)
A B
0 123.0 123.0
1 456.0 456.0
2 NaN 789.0
或者:
df.B = df.B.fillna(df.A)
print (df)
A B
0 123.0 123.0
1 456.0 456.0
2 NaN 789.0
Anf如果在替换为NaN
之后B
中没有int
值:
df.B = df.B.fillna(df.A).astype(int)
print (df)
A B
0 123.0 123
1 456.0 456
2 NaN 789