我有两个数据框,分别是 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_id
和column_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左右。
谢谢
答案 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