带熊猫的箱线图,groupby,子绘图,计算/描述性统计,汇总

时间:2019-01-08 05:58:07

标签: python pandas aggregate pandas-groupby boxplot

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

'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 ...

游戏是迄今为止一个团队所玩游戏的数量。例如,2,France,B,7表示来自法国的B队(目前正在进行第二场比赛)在持续7秒后才失去了对球的控制权。

我想要一个按国家分组的地块(每个国家的子地块),沿中轴有团队,每个队每场比赛的“控球间隔(秒)”总和的箱形图。我尝试了以下方法,

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()

但它不起作用。

有一种简单的方法吗?

2 个答案:

答案 0 :(得分:2)

我已经通过使用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)')

之所以可行,是因为ivot_table返回一个适合于boxplot的数据框对象。

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

答案 1 :(得分:1)

这可以简单地通过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

enter image description here