带 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()
。
假设正在进行多场足球比赛。当一支球队失去控球权时会生成一个数据点,并且控球权的持续时间会记录在文本文件中,如下所示:
'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()
。