熊猫使用“ groupby”子字符串,然后聚合特征

时间:2019-08-29 18:09:09

标签: pandas pandas-groupby

说我在一个游戏的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逻辑的更快的方法。有吗?

1 个答案:

答案 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