通过单列分位数对熊猫数据框进行分组

时间:2019-09-21 13:29:28

标签: python pandas dataframe

很抱歉,如果这是重复的帖子,虽然我找不到相关的帖子

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

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

P['A'].quantile(np.arange(10) / 10)

我不确定如何对A的符号进行分组。预先感谢!

2 个答案:

答案 0 :(得分:2)

如果您想将P分组,例如按四分位数运行:

gr = P.groupby(pd.qcut(P.A, 4, labels=False))

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

对于演示文稿,下面您仅打印了P 20行:

for key, grp in gr:
    print(f'\nGroup: {key}\n{grp}')

给出:

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

如您所见,每个组(四分位数)有5个成员,因此分组为 正确。

作为补充

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

pd.qcut(P.A, 4, labels=False, retbins=True)[1]

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

对于您的数据,它们是:

array([ 4.  , 12.25, 40.5 , 59.5 , 98.  ])

例如第一个四分位数在 4 12.35 之间。

答案 1 :(得分:1)

您可以使用quantile系列创建另一列,用分位数标签标记每一行,然后按该列分组。 numpy searchsorted为此非常有用:

import numpy as np
import pandas as pd
from random import seed

seed(100)
P = pd.DataFrame(np.random.randint(0, 100, size=(1000, 2)), columns=list('AB'))
q = P['A'].quantile(np.arange(10) / 10)
P['G'] = P['A'].apply(lambda x : q.index[np.searchsorted(q, x, side='right')-1])

由于分位数系列存储分位数间隔的较低值,因此请确保将参数side='right'传递给np.searchsorted不会得到0(最小值应为1或您的索引比您需要)。

现在您可以通过以下方式详细说明统计信息:

P.groupby('G').agg(['sum', 'mean']) #add to the list all the statistics method you wish