Сортировка значений в каждой группе групповых панд - PullRequest
1 голос
/ 26 октября 2019

У меня есть фрейм данных, где я сгруппировал данные на основе двух столбцов и агрегировал их с помощью функции count. Теперь я хочу, чтобы счет для каждой группы был в отсортированном порядке.

>>> df = pd.DataFrame([[1.1, 1.1, 1.1, 2.6, 2.5, 3.4,2.6,2.6,3.4,3.4,2.6,1.1,1.1,3.3], list('AAABBBBABCBDDD'), [1.1, 1.7, 2.5, 2.6, 3.3, 3.8,4.0,4.2,4.3,4.5,4.6,4.7,4.7,4.8], ['x/y/z','x/y/z','x/y/z','x/u','x/u','x/u/v','x/y/z','x','x/u/v/b','-','x/y/z','x','x','x/u/v/w'],['1','3','3','2','4','2','5','3','6','3','5','1','1','1']]).T
>>> df.columns = ['col1','col2','col3','col4','col5']
>>> df1 = df[['col2', 'col1', 'col4']].groupby(['col2', 'col4']).agg('count')
>>> df1
              col1
col2 col4
A    x           1
     x/y/z       3
B    x/u         2
     x/u/v       1
     x/u/v/b     1
     x/y/z       2
C    -           1
D    x           2
     x/u/v/w     1

Ожидаемый результат:

col2 col4        col1
A    x/y/z       3
     x           1
B    x/u         2
     x/y/z       2
     x/u/v       1
     x/u/v/b     1
C    -           1
D    x           2
     x/u/v/w     1

, который вы видите в отсортированном порядкедля каждой группы. Вот что я попробовал.

>>> df1 = df[['col1', 'col2', 'col4']].groupby(['col2', 'col4']).agg('count').sort_index(0, ascending=False)
>>> df1
              col1
col2 col4
D    x/u/v/w     1
     x           2
C    -           1
B    x/y/z       2
     x/u/v/b     1
     x/u/v       1
     x/u         2
A    x/y/z       3
     x           1

Как отсортировать группы по количеству?

Ответы [ 3 ]

2 голосов
/ 26 октября 2019

Сортировать нужно только по возрастанию col2 и по count, например:

result = df1.sort_values(by=['col2', 'col1'], ascending=[True, False])
print(result)

Вывод

              col1
col2 col4     

A    x/y/z       3
     x           1
B    x/u         2
     x/y/z       2
     x/u/v       1
     x/u/v/b     1
C    -           1
D    x           2
     x/u/v/w     1

Альтернативой может быть:

result = df1.assign(reverse=df1.col1*-1).sort_values(by=['col2', 'reverse']).drop('reverse', axis=1)
2 голосов
/ 26 октября 2019

Вы можете сортировать по нескольким столбцам, в нескольких порядках:

df[['col2', 'col1', 'col4']].groupby(['col2', 'col4']).count() \
    .sort_values(['col2', 'col1'], ascending=[True, False])
2 голосов
/ 26 октября 2019

Это немного сложнее, но в качестве дополнительного шага вы можете сгруппировать по первому уровню и отсортировать каждую группу по убыванию:

(df1.groupby(level=0, group_keys=False)
    .apply(lambda x: x.sort_values('col1', ascending=False)))

              col1
col2 col4         
A    x/y/z       3
     x           1
B    x/u         2
     x/y/z       2
     x/u/v       1
     x/u/v/b     1
C    -           1
D    x           2
     x/u/v/w     1
...