我正在尝试使用数据帧df_2中包含的值更新数据帧df_1。
df_1
ID B val val2
0 1 2 2
1 1 2 3
1 2 1 1
1 3 1 1
1 4 1 1
df_2
ID B val val2
0 1 1 3
1 1 3 3
1 3 3 3
我想要的结果在df_3中报告如下:
df_3
ID B val val2
0 1 1 3
1 1 3 3
1 2 1 1
1 3 3 3
1 4 1 1
您可以尽可能地使连接列为ID和B,并且在df_2中存在匹配项时,将替换这些值。关于值,df_2包含与df_1完全相同的列。
有两个问题提到该问题:Python pandas join on with overwrite和Python pandas - particular merge/replacement。这些问题都提到了我所遇到的完全相同的问题,但是当我尝试解决方案时,据报告联接花费了很多时间,我有一个庞大的数据集,我个人认为上述解决方案适用于小块数据。此外,这些问题还很老,所以我想知道熊猫中是否有任何新闻可以加快这一过程。
答案 0 :(得分:3)
由于ID并非唯一,因此您需要使用cumcount
创建其他密钥,然后对concat
用drop_duplicates
df1['keys']=df1.groupby('ID').cumcount()
df2['keys']=df2.groupby('ID').cumcount()
pd.concat([df1,df2]).drop_duplicates(['ID','keys'],keep='last').drop('keys',1).sort_index()
Out[31]:
ID B val val2
0 0 1 1 3
1 1 1 3 3
2 1 2 1 1
更新
df1.set_index(['ID','B'],inplace=True)
df1.update(df2.set_index(['ID','B']))
df1=df1.reset_index()
df1
Out[258]:
ID B val val2
0 0 1 1.0 3.0
1 1 1 3.0 3.0
2 1 2 1.0 1.0
3 1 3 3.0 3.0
4 1 4 1.0 1.0