比方说正在进行多场足球比赛。当球队失去控球权并且将持球时间记录在文本文件中时,将生成一个数据点,如下所示:
'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()
但它不起作用。
有一种简单的方法吗?
答案 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