I have two dataframes as follows:
df1
Name Id c1 c2 c3 c4
---------------------------
asd 101 a b c d
cdf 231 e ? 1
zxs 342 f o
ygg 521 g k p
mlk 432 h m z
abc 343 c x q
xyz 254 1 d 2
fgg 165 c z d mm
mnd 766 2 d v
df2
df2_Name df2_Id df2_c2 df2_c4
----------------------------------
asd 101 h d2
ygg 521 x cd
fgg 165 o cm
我希望能够将df1中的“Name”和“id”与df2中的“df2_Name”和“df2_id”进行匹配。无论在哪里找到匹配项,都将df1中“c2”和“c4”的值替换为df2中的“df2_c2”和“df2_c4”的值。 期望输出
Name Id c1 c2 c3 c4
-------------------------------
asd 101 a h c d2
cdf 231 e ? 1
zxs 342 f o
ygg 521 g x p cd
mlk 432 h m z
abc 343 c x q
xyz 254 1 d 2
fgg 165 c o d cm
mnd 766 2 d v
尝试解决方案1
df1[df1.set_index(['Name', 'id']).index.isin(df2.set_index(['df2_Name','df2_id']).index)].iloc[:,[3,5]].update(df2.iloc[:,[2,3]])
结果: 原始的 df1 被原封不动地返回。
尝试的解决方案 2:
df1.loc[df1.set_index(['Name', 'id']).index.isin(df2.set_index(['df2_Name','df2_id']).index), ['c2', 'c4']] = df2[['df2_c2', 'df2_c4']]
结果:引入了NaN
Name id c1 c2 c3 c4
----------------------------
asd 101 a NaN c NaN
cdf 231 e ? 1
zxs 342 f o
ygg 521 g NaN p NaN
mlk 432 h m z
abc 343 c x q
xyz 254 1 d 2
fgg 165 c NaN d NaN
mnd 766 2 d v
尝试解决方案3(仅适用于c2)
merged = df1.merge(df2, left_on=["id", "Name"], right_on=["df2_id", "df2_Name"])
merged["c2"] = merged.apply(lambda x: x["c2"] if pd.isnull(x["df2_c2"]) else x["df2_c2"], axis=1)
结果:
Name id c1 c2 c3 c4 df2_Name df2_id df2_c2 df2_c4
--------------------------------------------------------------
asd 101 a h c d asd 101 h d2
ygg 521 g x p ygg 521 x cd
fgg 165 c o d mm fgg 165 o cm
这个解决方案3替换了选定列的值,但它返回的是合并后的数据框而不是带有更新的整个df1。
有人能帮我解决这个问题吗?
注意:
在尝试以下解决方案后,仍然没有成功: