这是一个示例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
的部分格式。
答案 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的启发。