说我在一个游戏的6个会话中拥有以下熊猫数据框,其中我们记录了两个得分以及团队成员。
[{ payslipId: 3519 }, { periodsPerYear: 104} , { taxPeriod: 4}]
“团队”列是一个字符串,我们可以在团队中拥有任意数量的玩家(至少1个)
我想执行一个ID | Team | Score1 | Score2 |
------------------------------------------------
1 | Alice, Bob, Charles | 100 | 80 |
2 | Bob, Dylan, Eddy | 0 | 40 |
3 | Alice | 50 | 0 |
4 | Bob, Eddy | 150 | 80 |
5 | Felix, Charles, Bob | 100 | 0 |
6 | Alice, Felix | 0 | 40 |
类似的操作,让所有玩家(一直按“玩家”分组)进行他们一直参加的比赛。结果将是:
group-by
,依此类推。然后,某些行可以出现在几个不同的组中。
我的最终目标是最终获得根据每个球员的得分计算的功能。例如Group Alice:
ID | Team | Score1 | Score2 |
------------------------------------------------
1 | Alice, Bob, Charles | 100 | 80 |
3 | Alice | 50 | 0 |
6 | Alice, Felix | 0 | 40 |
Group Bob:
ID | Team | Score1 | Score2 |
------------------------------------------------
1 | Alice, Bob, Charles | 100 | 80 |
2 | Bob, Dylan, Eddy | 0 | 40 |
4 | Bob, Eddy | 150 | 80 |
5 | Felix, Charles, Bob | 100 | 0 |
Group Charles:
ID | Team | Score1 | Score2 |
------------------------------------------------
1 | Alice, Bob, Charles | 100 | 80 |
5 | Felix, Charles, Bob | 100 | 0 |
Group Dylan:
ID | Team | Score1 | Score2 |
------------------------------------------------
2 | Bob, Dylan, Eddy | 0 | 40 |
或meanScore1
,例如:
maxScore2
我目前已经拥有一个数据框,其中列出了所有可能的玩家。然后,我使用循环构造了上面的Dataframe,但是它是高度冗余且无效的,但是我希望有一种使用Player | meanScore1 | maxScore2
---------------------------------
Alice | 50 | 80
Bob | 87.5 | 80
Charles | 100 | 80
Dylan | 0 | 40
Eddy | 75 | 40
Felix | 50 | 40
和groupby
逻辑的更快的方法。有吗?
答案 0 :(得分:3)
pandas
不能很好地处理字符串或列表中的值。它更喜欢“整洁的数据”。幸运的是,在pandas
> = 0.25中,可以使用explode
方法将嵌套数据转换为整洁数据。在这里,您可以先拆分字符串值,然后拆分explode
,这样就可以进行简单的聚合操作。
d = dict(meanScore1=('Score1', 'mean'), maxScore2=('Score2', 'max'))
m = df['Team'].str.split(', ')
df.assign(Player=m).explode('Player').groupby('Player').agg(**d).reset_index()
Player meanScore1 maxScore2
0 Alice 50.0 80
1 Bob 87.5 80
2 Charles 100.0 80
3 Dylan 0.0 40
4 Eddy 75.0 80
5 Felix 50.0 40