根据具有相同形状的其他 data.frame 中的值替换 data.frame 中的值(Python)

时间:2021-04-28 15:08:13

标签: python pandas dataframe

我必须使用 data.frames df1df2 并且具有完全相同的大小和列名,但值不同。 df2 有很多 NaNdf1 只有少数。我希望 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:] == '' 

3 个答案:

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

您可以使用 df2True 填充 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
相关问题