熊猫:按两列分组,并以长格式查找第25,中位数,第75个百分位数和3列的平均值

时间:2018-07-30 00:32:19

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

这是一个示例DataFrame:

df = pd.DataFrame([[1, 1, 10, 11, 12],
                    [1, 1, 13, 14, 15], 
                    [1, 2, 16, 17, 18], 
                    [1, 2, 19, 20, 21],
                    [1, 3, 22, 23, 24], 
                    [1, 3, 25, 26, 27],
                    [1, 4, 28, 29, 30], 
                    [1, 4, 31, 32, 33], 
                    [1, 4, 34, 35, 36],
                    [1, 4, 37, 38, 39],
                    [1, 4, 40, 41, 42]])

df.columns = ['c1', 'c2', 'p1', 'p2', 'p3']
print(df)

礼物:

    c1  c2  p1  p2  p3
0    1   1  10  11  12
1    1   1  13  14  15
2    1   2  16  17  18
3    1   2  19  20  21
4    1   3  22  23  24
5    1   3  25  26  27
6    1   4  28  29  30
7    1   4  31  32  33
8    1   4  34  35  36
9    1   4  37  38  39
10   1   4  40  41  42

到目前为止我所做的:

example = df.groupby(['c1', 'c2'])['p1', 'p2', 'p3'].quantile([0.25, 0.50, 0.75]).unstack().reset_index()

print(example)

礼物:

  c1 c2     p1                  p2                  p3             
          0.25   0.5   0.75   0.25   0.5   0.75   0.25   0.5   0.75
0  1  1  10.75  11.5  12.25  11.75  12.5  13.25  12.75  13.5  14.25
1  1  2  16.75  17.5  18.25  17.75  18.5  19.25  18.75  19.5  20.25
2  1  3  22.75  23.5  24.25  23.75  24.5  25.25  24.75  25.5  26.25
3  1  4  31.00  34.0  37.00  32.00  35.0  38.00  33.00  36.0  39.00

我上面的输出可以正确找到百分位数,但是我也希望Average/Mean +上面的格式是wide格式,我希望它是{{ 1}}格式。

所以

long格式下,我想要另一列称为wide

average

我要寻找的最终输出是 c1 c2 p1 p2 p3 0.25 0.5 0.75 average 0.25 0.5 0.75 average 0.25 0.5 0.75 average 0 1 1 10.75 11.5 12.25 X 11.75 12.5 13.25 X 12.75 13.5 14.25 X 1 1 2 16.75 17.5 18.25 X 17.75 18.5 19.25 X 18.75 19.5 20.25 X 2 1 3 22.75 23.5 24.25 X 23.75 24.5 25.25 X 24.75 25.5 26.25 X 3 1 4 31.00 34.0 37.00 X 32.00 35.0 38.00 X 33.00 36.0 39.00 X 格式的上表,如下所示:

long

我遇到了两个麻烦。.我不知道如何将 c1 c2 0.25 0.50 0.75 average p 1 1 10.75 11.5 12.25 X 1 1 1 11.75 12.5 13.25 X 2 1 1 2.75 13.5 14.25 X 3 1 2 16.75 17.5 18.25 X 1 1 2 17.75 18.5 19.25 X 2 1 2 18.75 19.5 20.25 X 3 mean一起计算25th, 50th and 75th percentile并将其转换为long的部分格式。

2 个答案:

答案 0 :(得分:3)

使用describe

df.groupby(['c1', 'c2']).describe().stack(level=0)[['25%', '50%', '75%', 'mean']]

答案 1 :(得分:1)

quantile定义包装函数,然后传入计算列表(包括mean):

def q1(x):
    return x.quantile(0.25)

def q2(x):
    return x.median()

def q3(x):
    return x.quantile(0.75)

df.groupby(['c1', 'c2']).agg(['mean', q1, q2, q3]).stack(level=0)

          mean     q1    q2     q3
c1 c2                             
1  1  p1  11.5  10.75  11.5  12.25
      p2  12.5  11.75  12.5  13.25
      p3  13.5  12.75  13.5  14.25
   2  p1  17.5  16.75  17.5  18.25
      p2  18.5  17.75  18.5  19.25
      p3  19.5  18.75  19.5  20.25
   3  p1  23.5  22.75  23.5  24.25
      p2  24.5  23.75  24.5  25.25
      p3  25.5  24.75  25.5  26.25
   4  p1  34.0  31.00  34.0  37.00
      p2  35.0  32.00  35.0  38.00
      p3  36.0  33.00  36.0  39.00

要获得所需的确切输出(没有将MultiIndex和列重命名为p),请将其添加到方法链的末尾:

.reset_index().rename(columns={"level_2":"p"})

注意:此答案很大程度上受Wen's answer here的启发。