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

熊猫与重复的键合并-删除重复的行或阻止其创建

熊猫与重复的键合并-删除重复的行或阻止其创建

慕桂英4014372 2021-05-10 13:23:12
我有两个要合并的数据框,但是我的关键列包含重复项。数据框如下所示:Name,amount,idJohn,500.25,GH10Helen,1250.00,GH11Adam,432.54,GH11Sarah,567.12,GH12Category,amount,idFood,500.25,GH10Travel,1250.00,GH11Food,432.54,GH11我正在执行它与外部联接合并,以将所有内容包括在合并表中:merged_table = pd.merge(df1,df2,on="id",how='outer')我的输出是:Name,amount_x,id,category,amount_yJohn,500.25,GH10,Food,500.25Helen,1250.00,GH11,Travel,1250.00Helen,1250.00,GH11,Food,432.54Adam,432.54,GH11,Travel,1250.00Adam,432.54,GH11,Food,432.54Sarah,567.12,GH12但是,我想要的输出是:Name,amount_x,id,category,amount_yJohn,500.25,GH10,Food,500.25Helen,1250.00,GH11,Travel,1250.00Adam,432.54,GH11,Food,432.54Sarah,567.12,GH12因此,这里发生的是每个具有重复键的记录都与其他表上的每个记录匹配,因此输出具有4行而不是2行,中间的这两个行(第2行和第3行)是多余的。因此,我想到的解决方案是:防止以某种方式创建重复的行。在合并之前,我不能使用drop_duplicates(),因为那样的话,我将排除某些具有双键的行。但是另一列Amount在两个表上应具有相同的2个值,但是它们可能不同的可能性很小。使用合并的方式与我执行合并的方式相同,但是如果ID重复,则删除第2行和第3行并保留第1行和第4行,因为随着匹配的进行,其中df1中的第一行与df2中的第一行相连,然后是df2中的第二行,然后是df1中的第二行与df2中的第一行连接,然后是第二行,则第1行和第4行是正确的。我在这里考虑使用.apply()并编写一些lambda函数,但是我无法真正理解应该如何正确编写它。
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

我建议为计id数值创建新的帮助器列cumcount,然后按此值合并:


df1['g'] = df1.groupby('id').cumcount()

df2['g'] = df2.groupby('id').cumcount()


merged_table = pd.merge(df1,df2,on=["id", 'g'],how='outer')

print (merged_table)

    Name  amount_x    id  g Category  amount_y

0   John    500.25  GH10  0     Food    500.25

1  Helen   1250.00  GH11  0   Travel   1250.00

2   Adam    432.54  GH11  1     Food    432.54

3  Sarah    567.12  GH12  0      NaN       NaN

最后删除id:


merged_table = pd.merge(df1,df2,on=["id", 'g'],how='outer').drop('g', axis=1)

print (merged_table)

    Name  amount_x    id Category  amount_y

0   John    500.25  GH10     Food    500.25

1  Helen   1250.00  GH11   Travel   1250.00

2   Adam    432.54  GH11     Food    432.54

3  Sarah    567.12  GH12      NaN       NaN 

详细说明:


print (df1)

    Name   amount    id  g

0   John   500.25  GH10  0

1  Helen  1250.00  GH11  0

2   Adam   432.54  GH11  1

3  Sarah   567.12  GH12  0


print (df2)

  Category   amount    id  g

0     Food   500.25  GH10  0

1   Travel  1250.00  GH11  0

2     Food   432.54  GH11  1


查看完整回答
反对 回复 2021-05-18
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

在输出中(之后merge),您可以在下面应用。我们也可以单枪匹马地做到这一点,但我建议您先弄清楚。给你提示...


>>> df.drop_duplicates('Name',keep='first')

    Name  amount_x    id category amount_y

0   John    500.25  GH10     Food   500.25

1  Helen   1250.00  GH11   Travel     1250

3   Adam    432.54  GH11   Travel     1250

5  Sarah    567.12  GH12       


查看完整回答
反对 回复 2021-05-18
  • 2 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

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