为了账号安全,请及时绑定邮箱和手机立即绑定

Python pandas - 加入替换

Python pandas - 加入替换

智慧大石 2021-07-30 02:03:05
我正在尝试使用数据帧 df_2 中包含的值更新数据帧 df_1。df_1      ID    B    val    val2       0     1     2      2 1     1     2      31     2     1      11     3     1      11     4     1      1df_2      ID    B    val    val2       0     1     1      3 1     1     3      31     3     3      3我想要的结果在 df_3 中报告如下:df_3      ID    B    val    val2       0     1     1      3 1     1     3      31     2     1      11     3     3      31     4     1      1连接列是 ID 和 B,当 df_2 匹配时,我会替换这些值。关于值,df_2 包含与 df_1 完全相同的列。有两个问题提到了这个问题:Python pandas join on with overwrite和Python pandas - specific merge/replacement。这些问题提到了我遇到的完全相同的问题,但是当我尝试报告连接需要很长时间的解决方案时,我有一个巨大的数据集,我个人认为提到的解决方案适用于小块数据。此外,这些问题都是陈旧的,所以我想知道大熊猫是否有任何消息可以加速这个过程。
查看完整描述

1 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

您需要使用cumcount创建附加键,因为 ID 不是唯一的,然后我们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


查看完整回答
反对 回复 2021-08-03
  • 1 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信