我正在尝试解决合并两个数据集的问题。让我们看一个例子:
borrowed_money = {'name': ['Alex', 'Alex', 'David', 'David', 'David', 'Mike', 'Mike'],
'sum': [10,10,30,25,10,20,30]}
intersted_in = {'name': ['David', 'Alex', 'David', 'Mike', 'Mike', 'Alex', 'Mike','Alex', 'John'],
'toy': ['Car', 'Soldier', 'Plush', 'Soldier', 'Spaceship', 'Pen', 'Plush', 'Card', 'Spaceship']}
p1 = pandas.DataFrame(borrowed_money)
p2 = pandas.DataFrame(intersted_in)
pandas.merge(p1,p2)
结果:
name sum toy
0 Alex 10 Soldier
1 Alex 10 Pen
2 Alex 10 Card
3 Alex 10 Soldier
4 Alex 10 Pen
5 Alex 10 Card
6 David 30 Car
7 David 30 Plush
8 David 25 Car
9 David 25 Plush
10 David 10 Car
11 David 10 Plush
12 Mike 20 Soldier
13 Mike 20 Spaceship
14 Mike 20 Plush
15 Mike 30 Soldier
16 Mike 30 Spaceship
17 Mike 30 Plush
期望的结果:
对于我来说,期望的结果是两个数据集的组合,每个名称仅使用有限的次数。因此不会出现重复匹配的情况。
name sum toy
0 Alex 10 Soldier
1 Alex 10 Pen
2 David 30 Car
3 David 25 Plush
4 Mike 20 Soldier
5 Mike 30 Soldier
Alex 在第一个列表中被提及两次,因此它有两个匹配项 - Soldier 和 Pen。 David 在第二个列表中提到了两次,因此它有两个匹配项 - Car 和 Plush。
您能帮助我使用 pandas.merge 实现此结果吗?
最佳答案
使用GroupBy.cumcount
对于计数发生次数的辅助列,合并
并最后删除辅助列:
p1['g'] = p1.groupby('name').cumcount()
p2['g'] = p2.groupby('name').cumcount()
df = pd.merge(p1,p2).drop('g', axis=1)
print (df)
name sum toy
0 Alex 10 Soldier
1 Alex 10 Pen
2 David 30 Car
3 David 25 Plush
4 Mike 20 Soldier
5 Mike 30 Spaceship
关于python - Pandas 与独特的比赛融为一体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55510821/