对不起,如果这是重复的帖子,我找不到相关的帖子。
from random import seed
seed(100)
P = pd.DataFrame(np.random.randint(0, 100, size=(1000, 2)), columns=list('AB'))
我想要的是将P
按列A
的四分位数/分位数/十进制/etc分组,然后按组计算汇总统计数据(如mean
)。我可以将列的十进制定义为
P['A'].quantile(np.arange(10) / 10)
我不知道如何用A
的十进制来分组。提前感谢!
发布于 2019-09-21 14:16:20
如果您想按四分位数对P
进行分组,请运行:
gr = P.groupby(pd.qcut(P.A, 4, labels=False))
然后,您可以对这些组执行任何操作。
对于演示文稿,下面只提供了限制为20行的P
打印输出:
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个成员,因此分组是正确的。
作为补充
如果您对每个四分位数的B难字感兴趣,请运行:
pd.qcut(P.A, 4, labels=False, retbins=True)[1]
然后cut
返回两个结果(一个元组)。第一个元素(数字0)是之前返回的结果,但这次我们对第二个元素(编号1)感兴趣-- bin边框。
对于你的数据,它们是:
array([ 4. , 12.25, 40.5 , 59.5 , 98. ])
例如,第一个四分位数在4到12.35之间。
发布于 2019-09-21 14:05:11
您可以使用quantile
系列创建另一列,用其分位数标签标记每一行,然后按该列分组。numpy搜索排序对此非常有用:
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
https://stackoverflow.com/questions/58040767
复制相似问题