熊猫:按索引值分组,然后计算分位数?

时间:2016-01-28 11:56:42

标签: python pandas dataframe

我在month列上编制了一个DataFrame(使用df = df.set_index('month')设置,如果相关的话):

             org_code  ratio_cost   
month
2010-08-01   1847      8.685939     
2010-08-01   1848      7.883951     
2010-08-01   1849      6.798465     
2010-08-01   1850      7.352603     
2010-09-01   1847      8.778501     

我想添加一个名为quantile的新列,它会根据该月的ratio_cost值为每行分配一个分位数值。

所以上面的例子可能如下所示:

             org_code  ratio_cost   quantile
month
2010-08-01   1847      8.685939     100 
2010-08-01   1848      7.883951     66.6 
2010-08-01   1849      6.798465     0  
2010-08-01   1850      7.352603     33.3
2010-09-01   1847      8.778501     100

我该怎么做?我试过这个:

df['quantile'] = df.groupby('month')['ratio_cost'].rank(pct=True)

但我得KeyError: 'month'

更新:我可以重现该错误。

这是我的CSV文件:http://pastebin.com/raw/6xbjvEL0

以下是重现错误的代码:

df = pd.read_csv('temp.csv')
df.month = pd.to_datetime(df.month, unit='s')
df = df.set_index('month')
df['percentile'] = df.groupby(df.index)['ratio_cost'].rank(pct=True)
print df['percentile']

我在OSX上使用Pandas 0.17.1。

2 个答案:

答案 0 :(得分:15)

sort_index之前您必须rank

import pandas as pd

df = pd.read_csv('http://pastebin.com/raw/6xbjvEL0')

df.month = pd.to_datetime(df.month, unit='s')
df = df.set_index('month')

df = df.sort_index()

df['percentile'] = df.groupby(df.index)['ratio_cost'].rank(pct=True)
print df['percentile'].head()

month
2010-08-01    0.2500
2010-08-01    0.6875
2010-08-01    0.6250
2010-08-01    0.9375
2010-08-01    0.7500
Name: percentile, dtype: float64

答案 1 :(得分:0)

分位数查看比率成本的分布并找到 95% 的百分位数区域。您通过计算 q_cutoff 值来计算分位数。然后屏蔽结果值。

month=['2010-08-01','2010-08-01','2010-08-01','2010-08-01','2010-09-01']
org_code=[1847,1848,1849,1850,1847]
ratio_cost=[8.685939,7.883951,6.798465,7.352603,8.778501] 
df=pd.DataFrame({'month':month,'org_code':org_code,'ratio_cost':ratio_cost})

q_cutoff = df['ratio_cost'].quantile(0.95)
mask=df['ratio_cost'] < q_cutoff
trimmed_df=df[mask]

 print(trimmed_df)