我有两个要合并的数据框,但是我的关键列包含重复项。数据框如下所示:
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(),因为那样的话,我将排除某些具有双键的行。但是另一列“金额”在两个表上应具有相同的2个值,但是它们可能不同的可能性很小。
使用合并的方式与我执行合并的方式相同,但是如果ID重复,则删除第2行和第3行并保留第1行和第4行,因为随着匹配的进行,df1中的第一行是与df2中的第一行连接,然后是df2中的第二行,然后来自df1的第二行与df2中的第一行连接,然后与第二行连接,第1行和第4行是正确的。
我在这里考虑使用.apply()并编写一些lambda函数,但是我无法真正理解应该如何正确编写它。
答案 0 :(得分:4)
我建议为cumcount
计数id
个值创建新的帮助器列,然后按以下值合并:
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
答案 1 :(得分:0)
在您的输出中(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