按单列的分位数对 pandas 数据框进行分组

CPa*_*Pak 2 python dataframe pandas

抱歉,如果这是重复的帖子 - 但我找不到相关的帖子

from random import seed
seed(100)
P = pd.DataFrame(np.random.randint(0, 100, size=(1000, 2)), columns=list('AB'))
Run Code Online (Sandbox Code Playgroud)

我想要的是P按列的四分位数/分位数/十分位数/等进行分组A,然后按组计算聚合统计数据(例如mean)。我可以将列的十分位数定义为

P['A'].quantile(np.arange(10) / 10)
Run Code Online (Sandbox Code Playgroud)

我不知道如何对 的十分位数进行分组A。提前致谢!

Val*_*_Bo 5

如果您想P按四分位数进行分组,请运行:

gr = P.groupby(pd.qcut(P.A, 4, labels=False))
Run Code Online (Sandbox Code Playgroud)

然后您可以对这些组执行任何操作。

为了便于演示,下面有一个P限制为 20 行的打印输出:

for key, grp in gr:
    print(f'\nGroup: {key}\n{grp}')
Run Code Online (Sandbox Code Playgroud)

这使:

Group: 0
     A   B
0    8  24
3   10  94
10   9  93
15   4  91
17   7  49

Group: 1
     A   B
7   34  24
8   15  60
12  27   4
13  31   1
14  13  83

Group: 2
     A   B
4   52  98
5   53  66
9   58  16
16  59  67
18  47  65

Group: 3
     A   B
1   67  87
2   79  48
6   98  14
11  86   2
19  61  14
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,每个组(四分位数)有 5 个成员,因此分组是正确的。

作为补充

如果您对每个四分位数的边界感兴趣,请运行:

pd.qcut(P.A, 4, labels=False, retbins=True)[1]
Run Code Online (Sandbox Code Playgroud)

然后cut返回 2 个结果(一个元组)。第一个元素(数字 0)是之前返回的结果,但这次我们对 第二个元素(数字 1)感兴趣 - bin 边框。

对于您的数据,它们是:

array([ 4.  , 12.25, 40.5 , 59.5 , 98.  ])
Run Code Online (Sandbox Code Playgroud)

例如,第一个四分位数介于412.35之间。