2016-07-08 2 views
0

Я пытаюсь группировать кадр данных и сортировать его одновременно по абсолютной величине определенного столбца.Кадр данных группы Pandas и сортировка по значению столбца

 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 

ОБНОВЛЕНИЕ: готов к группировке:

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

Смежные вопросы