检索Pandas中每个组内的Kth分位数

时间:2014-10-14 00:14:10

标签: python pandas

说我在Pandas中有以下DataFrame:

                                        value
store          code
I1             AS10937               0.018868
               AS12711               0.002250
               AS12890               0.000229
               AS12914               0.000142
               AS12933               0.000532
I2             AP1001-404563         0.021739
               AP1001-404585         0.002503
               AP1001-439869         0.060000
               AP1001-441215         0.083333
               AP1001-445883         0.014493
I3             CW501555              0.009650
               CW501676              0.002222
I4             PB25015               0.000695
               PB25393               0.001806
               PB25571               0.022690
               PB25633               0.000431
I5             YH141208              0.000705
               YH167493              0.001292
               YH23351               0.001841
               YH257455              0.000772
               YH26109               0.004845
I6             RB10043               0.014806
               RB10045               0.023114
               RB10055               0.002543
               RB10065               0.006810
               RB10109               0.018757

我想检索每个组的底部 30%分位数(一个组是商店)。通过检索此分位数,我的意思是获得该系列(即codesvalues)(不仅仅是截止点)。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

好的,所以我对分位数的理解有限,所以你可能需要对此进行改进,但在我看来你想要做的是以下内容:

  • 按商店分组数据
  • 对于每个组使用DataFrame.quantile()方法
  • 找到0.3分位数值
  • 返回该组中等于或低于0.3分位数值的数据

为此,您可以对数据进行分组并使用apply方法应用执行上述操作的函数。

所以给出了这个数据:

import pandas as pd
store = ['I1', 'I1', 'I1', 'I1', 'I1', 
         'I2', 'I2', 'I2', 'I2', 'I2', 
         'I3', 'I3',
         'I4', 'I4', 'I4', 'I4',
         'I5', 'I5', 'I5', 'I5', 'I5', 
         'I6', 'I6', 'I6', 'I6',  'I6'] 
code =  ['AS10937 ', 'AS12711 ', 'AS12890 ', 'AS12914 ', 'AS12933 ', 
         'AP1001-404563 ', 'AP1001-404585 ', 'AP1001-439869 ', 'AP1001-441215 ', 'AP1001-445883 ', 
         'CW501555', 'CW501676', 
         'PB25015', 'PB25393', 'PB25571', 'PB25633', 
         'YH141208', 'YH167493', 'YH23351', 'YH257455', 'YH26109', 
         'RB10043', 'RB10045', 'RB10055', 'RB10065', 'RB10109']      
value = [0.018868, 0.002250, 0.000229, 0.000142, 0.000532, 
         0.021739, 0.002503, 0.060000, 0.083333, 0.014493, 
         0.009650, 0.002222, 
         0.000695, 0.001806, 0.022690, 0.000431, 
         0.000705, 0.001292, 0.001841, 0.000772, 0.004845, 
         0.014806, 0.023114, 0.002543, 0.006810, 0.018757]
DF = pd.DataFrame({'store' : store, 'code' : code, 'value' : value})

您可以按如下方式编写函数:

def quantile_function(df, quantile_point, col = 'value'):
    #Get the quantile value
    quantile_value = df.quantile(quantile_point)[col]
    #Select the data in the group that falls at or below the quantile value and return it
    return df[df[col] <=quantile_value]

然后使用groupby对象将该函数传递给apply,如下所示:

DF.groupby('store').apply(quantile_function, 0.3)

这导致以下输出:]

                    code store     value
store
I1    2         AS12890     I1  0.000229
      3         AS12914     I1  0.000142
I2    6   AP1001-404585     I2  0.002503
      9   AP1001-445883     I2  0.014493
I3    11        CW501676    I3  0.002222
I4    15         PB25633    I4  0.000431
I5    16        YH141208    I5  0.000705
      19        YH257455    I5  0.000772
I6    23         RB10055    I6  0.002543
      24         RB10065    I6  0.006810

这是你想要的吗?