【问题标题】:Groupby two columns and print different quantiles as seperate columnsGroupby 两列并将不同的分位数打印为单独的列
【发布时间】:2025-11-28 06:10:01
【问题描述】:

这是一个可重现的例子:

import pandas as pd

df = pd.DataFrame([['Type A', 'Event1', 1, 2, 3], ['Type A', 'Event1', 4, 5, 6], ['Type A', 'Event1', 7, 8, 9],
['Type A', 'Event2', 10, 11, 12], ['Type A', 'Event2', 13, 14, 15], ['Type A', 'Event2', 16, 17, 18], \
['Type B', 'Event1', 19, 20, 21], ['Type B', 'Event1', 22, 23, 24], ['Type B', 'Event1', 25, 26, 27], \
['Type B', 'Event2', 28, 29, 30], ['Type B', 'Event2', 31, 32, 33], ['Type B', 'Event2', 34, 35, 36]])

df.columns = ['TypeName', 'EventNumber', 'PricePart1', 'PricePart2', 'PricePart3']

print(df)

给予:

   TypeName EventNumber  PricePart1  PricePart2  PricePart3
0    Type A      Event1           1           2           3
1    Type A      Event1           4           5           6
2    Type A      Event1           7           8           9
3    Type A      Event2          10          11          12
4    Type A      Event2          13          14          15
5    Type A      Event2          16          17          18
6    Type B      Event1          19          20          21
7    Type B      Event1          22          23          24
8    Type B      Event1          25          26          27
9    Type B      Event2          28          29          30
10   Type B      Event2          31          32          33
11   Type B      Event2          34          35          36

这是我尝试过的:

df['Average'] = df[['PricePart1', 'PricePart2', 'PricePart3']].mean(axis = 1)

print(df)

       TypeName EventNumber  PricePart1  PricePart2  PricePart3  Average
0    Type A      Event1           1           2           3      2.0
1    Type A      Event1           4           5           6      5.0
2    Type A      Event1           7           8           9      8.0
3    Type A      Event2          10          11          12     11.0
4    Type A      Event2          13          14          15     14.0
5    Type A      Event2          16          17          18     17.0
6    Type B      Event1          19          20          21     20.0
7    Type B      Event1          22          23          24     23.0
8    Type B      Event1          25          26          27     26.0
9    Type B      Event2          28          29          30     29.0
10   Type B      Event2          31          32          33     32.0
11   Type B      Event2          34          35          36     35.0

现在我有了一个名为 Average 的新列,我可以按 TypeNameEventNumber 列分组,并使用这段代码找到第 25 和第 50 个百分位数:

print(df.groupby(['TypeName', 'EventNumber'])['Average'].quantile([0.25, 0.50]).reset_index())

我有什么:

  TypeName EventNumber  level_2  Average
0   Type A      Event1     0.25      3.5
1   Type A      Event1     0.50      5.0
2   Type A      Event2     0.25     12.5
3   Type A      Event2     0.50     14.0
4   Type B      Event1     0.25     21.5
5   Type B      Event1     0.50     23.0
6   Type B      Event2     0.25     30.5
7   Type B      Event2     0.50     32.0

我希望 level_2 作为单独的列,其中包含来自 Average 列的值,就像我创建的输出 DataFrame 一样:

df1 = pd.DataFrame([['Type A', 'Event1', 3.5, 5], ['Type A', 'Event2', 12.5, 14], ['Type B', 'Event1', 21.5, 23], ['Type B', 'Event2', 30.5, 32]])
df1.columns = ['TypeName', 'EventNumber', '0.25', '0.50']
print(df1)

我想要什么:

  TypeName EventNumber  0.25  0.50
0   Type A      Event1   3.5     5
1   Type A      Event2  12.5    14
2   Type B      Event1  21.5    23
3   Type B      Event2  30.5    32

我非常确定这是一些重复的,但我已经通过 * 进行了搜索,但由于问题的措辞困难(或者可能只是我很愚蠢)而没有找到我的答案

【问题讨论】:

    标签: python python-3.x pandas pandas-groupby


    【解决方案1】:

    unstackreset_index 一起使用:

    df = (df.groupby(['TypeName', 'EventNumber'])['Average']
           .quantile([0.25, 0.50])
           .unstack()
           .reset_index())
    print (df)
    
      TypeName EventNumber  0.25   0.5
    0   Type A      Event1   3.5   5.0
    1   Type A      Event2  12.5  14.0
    2   Type B      Event1  21.5  23.0
    3   Type B      Event2  30.5  32.0
    

    语法糖解决方案 - 不需要新列 Average,可以使用 groupby3 Series

    s = df[['PricePart1', 'PricePart2', 'PricePart3']].mean(axis = 1)
    
    df = (s.groupby([df['TypeName'], df['EventNumber']])
           .quantile([0.25, 0.50])
           .unstack()
           .reset_index())
    print (df)
    
      TypeName EventNumber  0.25   0.5
    0   Type A      Event1   3.5   5.0
    1   Type A      Event2  12.5  14.0
    2   Type B      Event1  21.5  23.0
    3   Type B      Event2  30.5  32.0
    

    【讨论】:

    • 感谢您的快速响应!
    • 虽然我还没有完全阅读与groupby, print multiple columns 相关的其他答案,但我已经看到我的问题的许多变体要求做类似的事情,如果对我的问题的回答比其他问题更直接我看到的问题,很可能很多人都遇到了我的问题,并且措辞更好并得到了答复。
    • 你是神。我希望我能努力达到你的水平。
    • @Abhishek - 我认为有时会有好主意,有时不会。这取决于。所以没有上帝;)
    • 嗨@jezreal,你能告诉我df.xsdf.loc有什么区别
    最近更新 更多