我有一个像这样的熊猫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
答案 0 :(得分:5)
先使用DataFrame.melt
,然后再计数crosstab
:
df1 = df.melt('week', var_name='player')
df = pd.crosstab([df1['week'], df1['player']], df1['value'])
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.stack
,SeriesGroupBy.value_counts
和unstack
的解决方案:
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)