带 pandas、groupby、子图、computations/descriptive 统计、聚合的箱线图

Boxplot with pandas, groupby, subplotting, computations/descriptive stats, aggregation

假设正在进行多场足球比赛。当一支球队失去控球权时会生成一个数据点,并且控球权的持续时间会记录在文本文件中,如下所示:

'Game','Country','Team','Ball Possession Interval (sec)' 1,Croatia,A,9 2,France,B,11 1,Croatia,A,8 4,Spain,C,10 1,Croatia,B,6 2,France,B,7 3,Germany,C,12 2,France,A,8 ...

Game 是一个团队迄今为止参加的比赛的计数。例如 2,France,B,7 表示来自法国的 B 队,现在在他们的第 2 场比赛中,在持续 7 秒后失去了球权。

我想要一个按国家分组的图(每个国家的子图),轴上有球队,以及每队每场比赛 'Ball Possession Interval (sec)' 总和的箱线图。我尝试了以下,

df.groupby('Country').boxplot(by='Team',column=*vector of sum of ball possession intervals per game*)

但我不知道要将 设置为什么。我希望我可以将其设置为以下内容,

df.groupby(['Country','Team','Game'])['Ball Possession Interval (sec)'].sum()

但是没用。

有没有简单的方法可以做到这一点?

这可以通过 pd.DataFrame.boxplot -

简单地完成
from matplotlib import pyplot as plt
df = pd.DataFrame({'A': ['a1', 'a2']*16,
         'B': ['b1', 'b2', 'b3', 'b4']*8,
         'val': [i for i in range(32)]
     })

df.head()
#    A   B  val
#0  a1  b1    0
#1  a2  b2    1
#2  a1  b3    2
#3  a2  b4    3
#4  a1  b1    4

df.boxplot(column='val', by=['A', 'B']) 
# In your case, df.boxplot(column = 'Ball Possession Interval(s)', by=['Country','Team','Game'])
plt.show() # if you're running this in an ipython terminal

我已经通过使用 pivot_table 了解了我想要的解决方案:

plotdf = df.pivot_table(index=['Country','Team','Game'], values='Ball Possession Interval (sec)', aggfunc=np.sum)

从 pivot_table 的文档中可以看出,values 是要聚合的列,aggfunc 是聚合方法。现在进行分组箱线图...

plotdf.groupby('Country').boxplot(by='Team', column='Ball Possession Interval (sec)')

这是有效的,因为 pivot_table returns 一个适合箱线图的数据框对象。

以下不起作用的原因是因为它 returns 一个不适合箱线图的系列,df.groupby(['Country','Team','Game'])['Ball Possession Interval (sec)'].sum()