2016-07-12 129 views
0

我有如下一个数据帧:如何获得Python中groupby列的百分位数?

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

这个怎么样?

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]) 
+0

它在某种程度上起作用,我需要100th百分位数太长,与名称与perct_n同名的列太长。 – marupav

+0

在quants的定义中将1更改为1.1,并将'str(x)'更改为''perct _'+ str(x)'或''perct _%。f'%(100 * x)' – Peter9192

+0

感谢Peter.That我需要的。 – marupav

相关问题