计算特定组的百分位数

Posted

技术标签:

【中文标题】计算特定组的百分位数【英文标题】:Calculating percentile for specific groups 【发布时间】:2016-08-25 00:01:56 【问题描述】:

我有 3 列。 Product IdPriceGroup(值 A、B、C、D)

我想获取每个组的价格百分位数,我正在运行以下代码。

for group, price in df.groupby(['group']):
    df['percentile'] = np.percentile(df['price'],60)

每组的百分位列只有一个值 3.44。 每组的预期值为2.12, 3.43, 3.65, 4.76. 8.99

这里出了什么问题,请告诉我。

【问题讨论】:

【参考方案1】:

我认为你可以在循环中使用不是所有的 DataFrame df 与列 price,而是将 price 与列 price 一起使用:

import pandas as pd
import numpy as np

np.random.seed(1)
df = pd.DataFrame(np.random.randint(10, size=(5,3)))
df.columns = ['Product Id','group','price']
print df
   Product Id  group  price
0           5      8      9
1           5      0      0
2           1      7      6
3           9      2      4
4           5      2      4

for group, price in df.groupby(['group']):
    print np.percentile(df['price'],60)
4.8
4.8
4.8
4.8
group   

for group, price in df.groupby(['group']):
    print np.percentile(price['price'],60)
0.0
4.0
6.0
9.0    

np.percentile 的另一种解决方案是输出Serie

print df.groupby(['group'])['price'].apply(lambda x: np.percentile(x,60))
group
0    0.0
2    4.0
7    6.0
8    9.0
Name: price, dtype: float64

DataFrameGroupBy.quantile 的解决方案:

print df.groupby(['group'])['price'].quantile(.6)
group
0    0.0
2    4.0
7    6.0
8    9.0
Name: price, dtype: float64

通过评论编辑:

如果您需要新列,请使用transform、docs:

>>> np.random.seed(1)
>>> df = pd.DataFrame(np.random.randint(10,size=(20,3)))
>>> df.columns = ['Product Id','group','price']
>>> df
    Product Id  group  price
0            5      8      9
1            5      0      0
2            1      7      6
3            9      2      4
4            5      2      4
5            2      4      7
6            7      9      1
7            7      0      6
8            9      9      7
9            6      9      1
10           0      1      8
11           8      3      9
12           8      7      3
13           6      5      1
14           9      3      4
15           8      1      4
16           0      3      9
17           2      0      4
18           9      2      7
19           7      9      8
>>> df['percentil'] = df.groupby(['group'])['price'].transform(lambda x: x.quantile(.6))
>>> df
    Product Id  group  price  percentil
0            5      8      9        9.0
1            5      0      0        4.4
2            1      7      6        4.8
3            9      2      4        4.6
4            5      2      4        4.6
5            2      4      7        7.0
6            7      9      1        5.8
7            7      0      6        4.4
8            9      9      7        5.8
9            6      9      1        5.8
10           0      1      8        6.4
11           8      3      9        9.0
12           8      7      3        4.8
13           6      5      1        1.0
14           9      3      4        9.0
15           8      1      4        6.4
16           0      3      9        9.0
17           2      0      4        4.4
18           9      2      7        4.6
19           7      9      8        5.8

【讨论】:

不确定这是否符合我的目的。我不需要打印输出。我想在同一数据框 df 中创建一个列“百分位数”,每个组的百分位数为 60。这意味着我的 df 现在将有 4 列,产品 ID、价格、组和百分位数。在下一步中,我想使用这个新的“百分位数”创建另一个列,以便我可以按其“价格”对每个“组”中的产品 ID 进行分类。我的下一行是 df['price_point'] = np.where(df['retailprice'] >= k,'high','low')【参考方案2】:

你可以试试 pandas quantile

df[['group', 'price']].groupby('group').quantile(.6)

返回请求轴上给定分位数的值,一个 la numpy.percentile。

【讨论】:

以上是关于计算特定组的百分位数的主要内容,如果未能解决你的问题,请参考以下文章

如何计算基于组的分位数?

python使用pandas中的groupby函数和agg函数计算每个分组数据的两个分位数(例如百分之10分位数和百分之90分位数)

Pandas .. 分位数函数是不是需要排序数据来计算百分位数?

R语言分位数计算Percentiles

在 SQL 中分析并形成分位数并计算落在各个分位数中的值的百分比

如何在 numpy / scipy 中获取特定百分位数的索引?