2016-07-08 91 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