Панды сортируют значения одного столбца по среднему значению другого столбца - PullRequest
0 голосов
/ 29 октября 2018

при условии, что у меня есть следующий фрейм данных:

    A    B
1  cat   3
2  cat   7
3  dog   5
4  dog   8
5  dog   11 
6  bird  3
7  bird  5

Среднее значение 'кошка' равно 5, среднее значение 'собака' равно 8, а среднее значение 'птица' равно 4, поэтому я хочу отсортировать данные таким образом, чтобы собака была первой, а не кошка и птица, как следующее:

    A    B
1  dog   5
2  dog   8
3  dog   11
4  cat   3
5  cat   7
6  bird  3
7  bird  5

каков наилучший способ сделать это? Я попытался установить столбец «А» для индексации, а затем поиграть с сортировкой, но не смог разобраться. Любая помощь будет оценена!

1 Ответ

0 голосов
/ 29 октября 2018

Используйте GroupBy.transform с mean для серии агрегированных значений того же размера, что и исходный DataFrame, затем используйте argsort in descending order для позиций и измените порядок на DataFrame.iloc:

df = df.iloc[(-df.groupby('A')['B'].transform('mean')).argsort()]
print (df)
      A   B
3   dog   5
4   dog   8
5   dog  11
1   cat   3
2   cat   7
6  bird   3
7  bird   5

Или преобразовать агрегированные значения в упорядоченные Categorical, а затем sort_values:

a = df.groupby('A')['B'].mean().sort_values(ascending=False)

df['A'] = pd.Categorical(df['A'], ordered=True, categories=a.index)
df = df.sort_values('A')
print (df)
      A   B
3   dog   5
4   dog   8
5   dog  11
1   cat   3
2   cat   7
6  bird   3
7  bird   5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...