我必须使用 data.frames df1
和 df2
并且具有完全相同的大小和列名,但值不同。 df2
有很多 NaN
而 df1
只有少数。我希望 NaN
中的每个 df2
都变成 0
,如果 df1
中有任何值在同一个地方(NaN
除外)。
例如:
df1
a b c
0 1 5 NaN
1 2 4 8
2 5 8 5
3 8 8 1
4 7 3 2
5 NaN 5 1
df2
a b c
0 5 5 NaN
1 NaN 4 8
2 3 8 NaN
3 NaN NaN 8
4 9 NaN 6
5 NaN 5 7
结果应该是这样的。
df2
a b c
0 5 5 NaN
1 0 4 8
2 3 8 0
3 0 0 8
4 9 0 6
5 NaN 5 7
我还是 Python 新手,目前找不到解决方案。我试过不成功:
for row in range(len(df1)):
if df1.iloc[row,1:] >= 0:
df2[row,1:] == 0
elif df1.iloc[row,1:] == '':
df2.iloc[row,1:] == ''
答案 0 :(得分:3)
您可以先将 df2 设置为 0,其中 df1 不为 null,然后在计算 2 个数组的元素明智最大值时采用 np.fmax
忽略 NaN
:
np.fmax(df2,df2.mask(df1.notna(),0))
编辑,感谢@Ben.T 的指出,以上仅适用于正值,请改用以下:
df2.fillna(0).where(df1.notna())
a b c
0 5.0 5.0 NaN
1 0.0 4.0 8.0
2 3.0 8.0 0.0
3 0.0 0.0 8.0
4 9.0 0.0 6.0
5 NaN 5.0 7.0
答案 1 :(得分:1)
另一种方法是使用 df1
方法从 NaN
中选择它是 pd.DataFrame.isnull
并将其替换为 df2
值,如下所示:
>>> df1
a b c
0 0 1.0 3.0
1 1 NaN 2.0
2 2 3.0 4.0
>>> df1 = pd.DataFrame({'a': [0, 1, 2], 'b': [1, np.NaN, 3], 'c': [np.NaN, 2, 4]})
>>> df2 = pd.DataFrame({'a': [0, 1, 2], 'b': [1, np.NaN, 3], 'c': [3, 2, 4]})
>>> df1
a b c
0 0 1.0 NaN
1 1 NaN 2.0
2 2 3.0 4.0
>>> df2
a b c
0 0 1.0 3
1 1 NaN 2
2 2 3.0 4
>>> df1[df1.isnull()] = df2
>>> df1
a b c
0 0 1.0 3.0
1 1 NaN 2.0
2 2 3.0 4.0
答案 2 :(得分:1)
您可以使用 df2
或 True
填充 False
中的值,具体取决于何时 df1.isna()
。然后,您可以替换 True 和 False:
df2.fillna(df1.isna()).replace(False,0).replace(True,np.nan)
a b c
0 5.0 5.0 NaN
1 0.0 4.0 8.0
2 3.0 8.0 0.0
3 0.0 0.0 8.0
4 9.0 0.0 6.0
5 NaN 5.0 7.0