Pandas groupby / pivot表用于计数2列中的值

时间:2019-10-29 11:56:57

标签: python pandas

我有一个像这样的熊猫DataFrame

week  player_a  player_b
 1      True      True
 1      True     False
 1     False     False
 2     False      True
 2     False     False
 2      True     False

,我想按周统计每个玩家的正确和错误的数量,但是我似乎无法将其限制在一个方便的大熊猫groupby或数据透视表操作中。所需的结果如下所示:

week            True  False
      player
 1   player_a     2     1
     player_b     1     2
 2   player_a     1     2
     player_b     1     2

2 个答案:

答案 0 :(得分:5)

先使用DataFrame.melt,然后再计数crosstab

df1 = df.melt('week', var_name='player')

df = pd.crosstab([df1['week'], df1['player']], df1['value'])

或使用DataFrame.pivot_table

df = df1.pivot_table(index=['week', 'player'], columns='value', fill_value=0, aggfunc='size')

或通过GroupBy.size汇总计数并通过Series.unstack进行整形:

df = df1.groupby(['week', 'player', 'value']).size().unstack(fill_value=0)

print (df)
value          False  True 
week player                
1    player_a      1      2
     player_b      2      1
2    player_a      2      1
     player_b      2      1

以及DataFrame.stackSeriesGroupBy.value_countsunstack的解决方案:

df = df.set_index('week').stack().groupby(level=[0,1]).value_counts().unstack(fill_value=0)
print (df)
               False  True 
week                       
1    player_a      1      2
     player_b      2      1
2    player_a      2      1
     player_b      2      1

答案 1 :(得分:5)

使用熊猫数据透视表功能并按大小进行汇总。

df = df.pivot_table(index=['week','player'], columns='value', aggfunc='size', fill_value=0)