如何在python中获取groupby列的百分位数?

时间:2016-07-12 10:33:49

标签: python pandas

我有一个数据框如下:

df = pd.DataFrame({'state': ['CA', 'WA', 'CO', 'AZ'] * 3,
               'office_id': list(range(1, 7)) * 2,
               'sales': [np.random.randint(100000, 999999) for _ in range(12)]})

为了获得销售的百分位数,明智的是,我写了以下代码:

pct_list1 = []
pct_list2 = []
for i in df['state'].unique().tolist():
    pct_list1.append(i)
    for j in range(0,101,10):
        pct_list1.append(np.percentile(df[df['state'] == i]['sales'],j))
    pct_list2.append(pct_list1)
    pct_list1 = []

colnm_list1 = []
for k in range(0,101,10):
    colnm_list1.append('perct_'+str(k))

colnm_list2 = ['state'] + colnm_list1

df1 = pd.DataFrame(pct_list2)
df1.columns = colnm_list2
df1

我们可以优化此代码吗?

我觉得,我们也可以使用

df1 = df[['state','sales']].groupby('state').quantile(0.1).reset_index(level=0)
df1.columns = ['state','perct_0']
for i in range(10,101,10):
    df1.loc[:,('perct_'+str(i))] = df[['state','sales']].groupby('state').quantile(float(i/100.0)).reset_index(level=0)['sales']

如果还有其他选择,请提供帮助。

感谢。

1 个答案:

答案 0 :(得分:1)

这个怎么样?

quants = np.arange(.1,1,.1)
pd.concat([df.groupby('state')['sales'].quantile(x) for x in quants],axis=1,keys=[str(x) for x in quants])