我有一个较大的数据帧,其中有一列我想用较小数据帧中的新值进行更新,仅当另一列的行值匹配时。左连接具有正确的行,但有两列我想要“更新”的值(左和右)。我尝试过使用 drop 进行左合并,但当然,这会清除我试图在匹配列不匹配的地方更新的列中的值。我也尝试过以下变体:
tips.loc[tips['tip'] < 2, 'tip'] = 2
但我收到有关需要匹配的系列长度的错误,因为我更新的表较小。我也查看了 DataFrame.combine_first() ,但文档没有显示它需要任何选项,也没有产生我正在寻找的东西。
这是一个例子:
df = pd.DataFrame({'CAT': ['A', 'B', 'C', 'D', 'E'], 'Value': [12, 34, np.NaN, 43, 21]})
CAT Value
0 A 12
1 B 34
2 C NaN
3 D 43
4 E 21
df2 = pd.DataFrame({'CAT': ['C', 'F', 'G'], 'Value': [22, 99, 44]})
CAT Value
0 C 22
1 F 99
2 G 44
结果应该是这样的:
CAT Value
0 A 12
1 B 34
2 C 22
3 D 43
4 E 21
虽然此示例中的左框架已更新 NaN,但我并不是专门针对这种情况。我想覆盖那里的任何值。有什么帮助吗?谢谢。
最佳答案
看起来您想要将 df
中的 Value
替换为 df2
中相应的 Value
,如果值(value)存在。即,假设您有一个 CAT
F,其在 df
中的对应值为 36
,您会希望将其替换为 99(来自df2
)。
使用合并
:
df= df.merge(df2, on = 'CAT', how = 'left')
df['Value'] = df[['Value_x', 'Value_y']].apply(lambda x: np.where(df['Value_y'].isna(), df['Value_x'], df['Value_y'])).drop(columns = ['Value_y'])
df.drop(columns = ['Value_x', 'Value_y'])
输出:
CAT Value
0 A 12.0
1 B 34.0
2 C 22.0
3 D 43.0
4 E 21.0
5 F 99.0
关于python - 使用另一个数据帧同一列中的值更新数据帧中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52581676/