从另一个df更新多个df列

时间:2020-02-13 07:27:28

标签: python-3.x pandas dataframe

我有两个数据框,分别是 df1 df2 。我想根据键列从 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 中的col2年龄。这里的关键列是party_id

我尝试用其键(<列>,一次一列)将 df2 映射到字典中。这里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 == 3 df1 中有多个条目。
不在 df2 中的键,它们在该列中的相应值应保持不变。

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

谢谢

1 个答案:

答案 0 :(得分:0)

想法是首先使用DataFrame.merge并进行左连接,然后将两个DataFrame中具有相同的列获取到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