繁体   English   中英

从另一个 df 更新多列 df

[英]Updating multiple columns of df from another df

我有两个数据框, df1df2 我想根据关键列从df2列(两个数据框中的公共列的名称相同)中的值更新 df1 的某些列(不是全部)。 df1可以有该键的多个条目,但在df2 中,每个键只有一个条目。

df2 :
   party_id  age person_name  col2
0         1   12       abdjc  abc
1         2   35       fAgBS  sfd
2         3   65        Afdc  shd
3         5   34      Afazbf  qfwjk
4         6   78      asgsdb  fdgd
5         7   35       sdgsd  dsfbds
df1: 
     party_id  account_id         product_type  age         dob   status  col2
0           1           1              Current   25  28-01-1994   active  sdag
1           2           2              Savings   31  14-07-1988  pending  asdg
2           3           3                Loans   65  22-07-1954   frozen  sgsdf
3           3           4  Over Draft Facility   93  29-01-1927   active  dsfhgd
4           4           5             Mortgage   93  01-03-1926  pending  sdggsd

在这个例子中,我想根据df2 中存在的值更新df1 中的 age, col2 这里的关键列是party_id

我尝试使用他们的键将df2映射到 dict (列明智,一次一列)。 这里key_name = party_idcolumn_name = age

dict_key = df2[key_name]
dict_value = df2[column_name]
temp_dict = dict(zip(dict_key, dict_value))

然后将其映射到 df1

df1[column_name].map(temp_dict).fillna(df1[column_name])

但这里的问题是它只映射一个条目,而不是该键值的全部。在这个例子中party_id == 3df1 中有多个条目。
不在df2 中的键,该列的相应值应保持不变。

任何人都可以帮助我提供有效的解决方案,因为我的df1大小超过 500k? 这样所有列都可以同时更新。
df2大小适中,大约 3k 左右。

谢谢

想法是DataFrame.merge与左连接一起使用,然后将两个 DataFrames 中相同的列获取到cols并通过DataFrame.fillna用原始值替换缺失值:

df = df1.merge(df2.drop_duplicates('party_id'), on='party_id', suffixes=('','_'), how='left')
cols = df2.columns.intersection(df1.columns).difference(['party_id'])
df[cols] = df[cols + '_'].rename(columns=lambda x: x.strip('_')).fillna(df[cols])
df = df[df1.columns]
print (df)
   party_id   age person_name    col2
0         1  25.0       abdjc    sdag
1         2  31.0       fAgBS    asdg
2         3  65.0        Afdc   sgsdf
3         5  34.0      Afazbf   qfwjk
4         6  78.0      asgsdb    fdgd
5         7  35.0       sdgsd  dsfbds

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM