【问题标题】:Boxplot with pandas, groupby, subplotting, computations/descriptive stats, aggregation带有 pandas、groupby、子图、计算/描述性统计、聚合的箱线图
【发布时间】:2026-02-10 07:50:02
【问题描述】:

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

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

但它不起作用。

有没有简单的方法来做到这一点?

【问题讨论】:

    标签: python pandas aggregate pandas-groupby boxplot


    【解决方案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()

    【讨论】: