Pandas按2列计数值的分组/透视表

3

I have a pandas DataFrame like so

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

我希望能够按照每周统计每位玩家的True和False数量,但我似乎无法将其转化为方便的pandas groupby或pivot table操作。所需结果如下:

week            True  False
      player
 1   player_a     2     1
     player_b     1     2
 2   player_a     1     2
     player_b     1     2
2个回答

6

首先使用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

6
使用pandas的pivot_table函数,并按大小进行聚合。
df = df.pivot_table(index=['week','player'], columns='value', aggfunc='size', fill_value=0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接