带有 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

使用带有参数的 Pandas groupby() + apply()

pandas groupby 聚合具有多列的自定义函数