熊猫与独特的比赛融为一体

时间:2019-04-04 08:04:55

标签: python pandas dataframe merge

我正在尝试合并两个数据集来解决问题。我们来看一个例子:

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

亚历克斯在第一名单中被两次提及,因此它有两场比赛-士兵和彭。大卫在第二个清单中两次提到,因此有两场比赛-汽车和毛绒。

可以请您使用pandas.merge帮助我达到此效果吗?

1 个答案:

答案 0 :(得分:3)

使用GroupBy.cumcount作为辅助对象列以计算发生次数,merge,最后删除辅助对象列:

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