2016-07-08 90 views
0

我想分组数据框,并在同一时间由某一列的绝对值进行排序。熊猫集团的数据框和按列值排序

 groups values foo bar 
75  A  3  1 2 
77  B  -3  31 34 
112  A  4  0 4 
129  C  50  5 3 
134  C  -60  44 5 

在整个数据帧,我可以使用

df.reindex(df.values.abs().sort_values(ascending=False).index) 

这工作完全正常。但是,对于分组的数据帧,这显然不起作用。

当我尝试,

df.groupby('groups')['values'].reindex(df.values.abs().sort_values(ascending=False).index) 

我得到预期的错误:

AttributeError: Cannot access callable attribute 'reindex' of 'SeriesGroupBy' objects, try using the 'apply' method 

试图apply可能需要作出的绝对值另一列,但我不希望添加这个。有没有一个干净的方式来实现呢?

所需的输出将是被排序的值的列中的分组的数据帧(对象):

for groups, data in df_grouped: 
     print group, data 
A, 
     values foo bar 
75  3  1 2 
112  4  0 4 
B, 
     values foo bar 
77  -3  31 34 
C, 
     values foo bar 
134  -60 44 5 
129  50  5 3 

回答

2

UPDATE2:

In [433]: for g,x in grp: 
    .....:  print(g, x) 
    .....: 
A  groups values foo bar 
112  A  4 0 4 
77  A  3 1 2 
B groups values foo bar 
77  B  -3 31 34 
C  groups values foo bar 
134  C  -60 44 5 
129  C  50 5 3 

UPDATE:准备分组:

In [428]: grp = (df.assign(abs_val=df['values'].abs()) 
    .....:   .sort_values(['groups','abs_val'], ascending=[1,0]) 
    .....:   .drop('abs_val', 1) 
    .....:   .groupby('groups')) 

In [429]: grp.agg({'foo': ['first','last'], 'bar': ['min','mean','max']}) 
Out[429]: 
     foo  bar 
     first last min mean max 
groups 
A   0 1 2 3 4 
B   31 31 34 34 34 
C   44 5 3 4 5 

OLD答案:

In [393]: df.assign(abs_val=df['values'].abs()).sort_values(['groups','abs_val'], ascending=[1,0]).drop('abs_val', 1) 
Out[393]: 
    groups values 
112  A  4 
77  A  3 
77  B  -3 
134  C  -60 
129  C  50 
+0

的排序是正确的,但我想有对数据的进一步处理一个分组的数据帧返回。 – Fourier

+0

你可以[发布](http://stackoverflow.com/posts/38267145/edit)期望的输出? – MaxU

+0

看到我编辑的问题的预期输出。谢谢@MaxU – Fourier