Pandas:使用另一个数据框更改一系列单元格的值

问题描述

希望你一切顺利。 所以我有两个数据框,我想使用另一个数据框更改特定范围的值,如下所示:

所以我有这两个数据框

Dataframe 1 :

    A   B   C
0   foo 2   3
1   foo 9   nan
2   foo 1   4
3   bar 90  1
4   boo 12  89

Dataframe 2 :

    M   N   O
0   foo 8   19
1   foo 3   8
2   foo 5   nan
3   bar 0   16
4   boo 1   100

所以我想用数据帧 2 中存在的关于 'foo' 项(列 M)的 N 和 O 的值替换数据帧 1 中关于 'foo' 项(列 A)的 B 和 C 的值作为以下:

Dataframe 1 :

    A   B   C
0   foo 8   19
1   foo 3   8
2   foo 5   nan
3   bar 90  1
4   boo 12  89

解决方法

您可以将 pandas.DataFrame.wheredf1['A'] 的条件一起使用:

df1[['B','C']] = df1[['B','C']].where(~df1['A'].eq('foo'),df2[['B','C']])

或者反过来:

df1[['B','C']] = df2[['B','C']].where(df1['A'].eq('foo'),df1[['B','C']])

如果 df2 中的列具有不同的名称,您可以使用 .values 访问底层的 numpy 数组:

df1[['B',df2[['N','O']].values)
,
df1 = pd.DataFrame({'A': ['foo','foo','bar','boo'],'B': [2,9,1,90,12],'C':[3,np.nan,4,89]})
df2 = pd.DataFrame({'A': ['foo','B': [8,3,5,1],'C':[19,8,16,100]})

df1.loc[df1['A']=='foo',['B','C']] = df2[df2['A']=='foo'][['B','C']]
df1

给出:

    A   B   C
0   foo 8   19.0
1   foo 3   8.0
2   foo 5   NaN
3   bar 90  1.0
4   boo 12  89.0