带有 pandas、groupby、子图、计算/描述性统计、聚合的箱线图
Posted
技术标签:
【中文标题】带有 pandas、groupby、子图、计算/描述性统计、聚合的箱线图【英文标题】:Boxplot with pandas, groupby, subplotting, computations/descriptive stats, aggregation 【发布时间】:2019-06-02 19:12:33 【问题描述】:假设正在进行多场足球比赛。当球队失去控球权时会生成一个数据点,并且控球时间会记录在一个文本文件中,如下所示:
'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 队,现在正在进行第二场比赛,在持续 7 秒后刚刚失去对球的控球权。
我想要一个按国家/地区分组的图(每个国家/地区的子图),沿轴包含球队,以及每支球队每场比赛的“控球间隔(秒)”总和的箱线图。我尝试了以下,
df.groupby('Country').boxplot(by='Team',column=*vector of sum of ball possession intervals per game*)
但我不知道将 column 设置为什么。我希望我可以将其设置为以下,
df.groupby(['Country','Team','Game'])['Ball Possession Interval (sec)'].sum()
但它不起作用。
有没有简单的方法来做到这一点?
【问题讨论】:
【参考方案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
【讨论】:
这不是我想要的。我想要每个国家/地区的子图类似于df.groupby('Country').boxplot(by='Team',column='val')
生成的子图,但“val”需要是每个游戏的总时间间隔向量。我在定义“val”时遇到了麻烦。为 'val' 插入 df.groupby(['Country','Team','Game'])['Ball Possession Interval(s)'].sum()
不起作用。【参考方案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)')
这是有效的,因为 pivot_table 返回一个适用于箱线图的数据框对象。
以下不起作用的原因是它返回了一个不适用于箱线图的系列,df.groupby(['Country','Team','Game'])['Ball Possession Interval (sec)'].sum()
。
【讨论】:
以上是关于带有 pandas、groupby、子图、计算/描述性统计、聚合的箱线图的主要内容,如果未能解决你的问题,请参考以下文章
使用 matplotlib 子图绘制 pandas groupby 输出
带有最小值、最大值和总和的 Pandas 数据框 Groupby
panda groupby ID,并计算相对于坐标中心的半径
带有 MultiIndexing 的 Pandas 数据框中的 Groupby