gpt4 book ai didi

python - 根据另一个数据框选定的行和列部分更新数据框

转载 作者:行者123 更新时间:2023-12-01 07:25:44 24 4
gpt4 key购买 nike

我有两个数据框,如下所示:

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。

谁能帮我解决这个问题吗?

注意:

尝试以下解决方案后提出此问题,但没有成功:

  1. update-a-pandas-dataframe-with-data-from-another-dataframe
  2. replace-column-values-based-on-another-dataframe-python-pandas-better-way

最佳答案

我将使用merge来连接两个数据帧。然后,您将获得包含旧值的列以及包含新值和 nan 值的列。然后使用 apply 加入这些列:

merged = df1.merge(df2, how='outer', 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)
# Same for c4
# Drop df2_c2 and df2_c4

我目前无法测试它,所以请告诉我这是否适合您。

关于python - 根据另一个数据框选定的行和列部分更新数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57462064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com