为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕娘9325324 2022-06-02 15:25:57
抱歉,如果这是重复的帖子-虽然我找不到相关的帖子from random import seedseed(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 回答

?
达令说

TA贡献1821条经验 获得超6个赞

如果您想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)感兴趣 - bin 边界。


对于您的数据,它们是:


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

因此,例如,第一个四分位数介于4和12.35之间。


查看完整回答
反对 回复 2022-06-02
?
跃然一笑

TA贡献1826条经验 获得超6个赞

您可以使用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


查看完整回答
反对 回复 2022-06-02
  • 2 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信