猿问

Python pandas - 加入替换

我正在尝试使用数据帧 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 - specific merge/replacement。这些问题提到了我遇到的完全相同的问题,但是当我尝试报告连接需要很长时间的解决方案时,我有一个巨大的数据集,我个人认为提到的解决方案适用于小块数据。此外,这些问题都是陈旧的,所以我想知道大熊猫是否有任何消息可以加速这个过程。


智慧大石
浏览 113回答 1
1回答

慕妹3242003

您需要使用cumcount创建附加键,因为 ID 不是唯一的,然后我们concat 使用drop_duplicatesdf1['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  val20   0  1    1     31   1  1    3     32   1  2    1     1更新df1.set_index(['ID','B'],inplace=True)df1.update(df2.set_index(['ID','B']))df1=df1.reset_index()df1Out[258]:    ID  B  val  val20   0  1  1.0   3.01   1  1  3.0   3.02   1  2  1.0   1.03   1  3  3.0   3.04   1  4  1.0   1.0
随时随地看视频慕课网APP

相关分类

Python
我要回答