【问题标题】: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

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

【问题讨论】:

    标签: python loops numpy pandas group-by


    【解决方案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
    

    通过评论编辑:

    如果您需要新列,请使用transformdocs

    >>> 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-26
      • 1970-01-01
      • 2020-10-07
      • 2011-12-29
      • 2013-06-20
      • 2017-05-15
      • 2016-03-11
      • 2021-11-29
      相关资源
      最近更新 更多