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

我有两个要合并的数据框,但是我的关键列包含重复项。数据框如下所示:


Name,amount,id

John,500.25,GH10

Helen,1250.00,GH11

Adam,432.54,GH11

Sarah,567.12,GH12


Category,amount,id

Food,500.25,GH10

Travel,1250.00,GH11

Food,432.54,GH11

我正在执行它与外部联接合并,以将所有内容包括在合并表中:


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

我的输出是:


Name,amount_x,id,category,amount_y

John,500.25,GH10,Food,500.25

Helen,1250.00,GH11,Travel,1250.00

Helen,1250.00,GH11,Food,432.54

Adam,432.54,GH11,Travel,1250.00

Adam,432.54,GH11,Food,432.54

Sarah,567.12,GH12

但是,我想要的输出是:


Name,amount_x,id,category,amount_y

John,500.25,GH10,Food,500.25

Helen,1250.00,GH11,Travel,1250.00

Adam,432.54,GH11,Food,432.54

Sarah,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函数,但是我无法真正理解应该如何正确编写它。


慕桂英4014372
浏览 111回答 2
2回答

SMILET

我建议为计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_y0   John    500.25  GH10  0     Food    500.251  Helen   1250.00  GH11  0   Travel   1250.002   Adam    432.54  GH11  1     Food    432.543  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_y0   John    500.25  GH10     Food    500.251  Helen   1250.00  GH11   Travel   1250.002   Adam    432.54  GH11     Food    432.543  Sarah    567.12  GH12      NaN       NaN 详细说明:print (df1)    Name   amount    id  g0   John   500.25  GH10  01  Helen  1250.00  GH11  02   Adam   432.54  GH11  13  Sarah   567.12  GH12  0print (df2)  Category   amount    id  g0     Food   500.25  GH10  01   Travel  1250.00  GH11  02     Food   432.54  GH11  1

红颜莎娜

在输出中(之后merge),您可以在下面应用。我们也可以单枪匹马地做到这一点,但我建议您先弄清楚。给你提示...>>> df.drop_duplicates('Name',keep='first')    Name  amount_x    id category amount_y0   John    500.25  GH10     Food   500.251  Helen   1250.00  GH11   Travel     12503   Adam    432.54  GH11   Travel     12505  Sarah    567.12  GH12       
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python