【发布时间】:2018-05-16 17:53:05
【问题描述】:
有一个球员在不同球队(组)中比赛的数据框,所以我需要计算每个球员与他只出现在他的球队球员的所有交集。
df = pd.DataFrame({ 'Team' : ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'],
'Player' : ['Joe', 'Mike', 'Steve', 'Henry', 'Steve', 'Joe', 'Mike', 'Joe', 'Steve', 'Dan', 'Henry']
})
df
Out[6]:
Player Team
0 Joe A
1 Mike A
2 Steve A
3 Henry B
4 Steve B
5 Joe B
6 Mike C
7 Joe C
8 Steve C
9 Dan C
10 Henry C
输出必须是这样的。 PS我是手动做的,所以可能会出错。
Joe Mike 2
Joe Steve 3
Joe Henry 2
Joe Dan 1
Mike Joe 2
Mike Steve 2
Mike Dan 1
Mike Henry 1
Steve Joe 3
Steve Mike 2
Steve Henry 2
Steve Henry 1
Henry Steve 2
Henry Joe 2
Henry Mike 1
Henry Dan 1
Dan Steve 1
Dan Mike 1
Dan Joe 1
Dan Henry 1
说明:乔已经出现在所有 3 支球队中,所以我只计算他与其他球员在他出现的 3 支球队之间的交集。同时,Dan 只在 C 队,我只考虑与 C 队其他球员的交集。
我尝试通过 groupby 和笛卡尔积连接来做到这一点,但不知道如何组合它。有人可以帮忙解决这个任务吗?
gp = df.groupby('Player')['Team'].apply(lambda x: "%s" % ', '.join(x)).to_frame()
index = pd.MultiIndex.from_product([gp.index, gp.index], names = ["a", "b"])
new_df = pd.DataFrame(index = index).reset_index()
【问题讨论】:
-
我认为一个起点是
df.merge(df, on='Team')来获得你的交叉加入,然后应用.groupby(['Player_x', 'Player_y']).Team.size()应该接近你想要的,你会想要从中删除相同的 X 和 Y 玩家。 -
@Jon Clements♦ 一切正常。留下评论,我会批准它。非常感谢。唯一的区别是需要删除相同的对(Joe-Joe m Henry-Henry 等)
-
我刚回到办公桌前……我会看看我是否真的不能写出实际的答案 - 忍耐:)
-
在任何方便的时候写下答案,我会批准它:)
标签: python-3.x pandas