Pandas: сортировка столбцов по их среднему значению

У меня есть dataframe в Pandas, я хотел бы отсортировать его столбцы (т.е. получить новый фрейм данных или представление) в соответствии со средним значением своих столбцов (или, например, их значением std). В документации говорится о сортировке по метке или значению, но я не смог найти ничего по пользовательским методам сортировки.

Как я могу это сделать?

Ответ 1

Вы можете использовать mean метод sort_values метод sort_values:

In [11]: df = pd.DataFrame(np.random.randn(4,4), columns=list('ABCD'))

In [12]: df
Out[12]:
          A         B         C         D
0  0.933069  1.432486  0.288637 -1.867853
1 -0.455952 -0.725268  0.339908  1.318175
2 -0.894331  0.573868  1.116137  0.508845
3  0.661572  0.819360 -0.527327 -0.925478

In [13]: df.mean()
Out[13]:
A    0.061089
B    0.525112
C    0.304339
D   -0.241578
dtype: float64

In [14]: df.mean().sort_values()
Out[14]:
D   -0.241578
A    0.061089
C    0.304339
B    0.525112
dtype: float64

Затем вы можете изменить порядок столбцов с помощью reindex:

In [15]: df.reindex(df.mean().sort_values().index, axis=1)
Out[15]:
          D         A         C         B
0 -1.867853  0.933069  0.288637  1.432486
1  1.318175 -0.455952  0.339908 -0.725268
2  0.508845 -0.894331  1.116137  0.573868
3 -0.925478  0.661572 -0.527327  0.819360

Примечание. В более ранних версиях pandas sort_values раньше был order, но order был объявлен устаревшим как часть 0.17, чтобы быть более совместимым с другими методами сортировки. Кроме того, в более ранних версиях нужно было использовать reindex_axis вместо reindex.

Ответ 2

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

df = pd.DataFrame(np.random.randn(4,4), columns=list('ABCD'))
df.assign(m=df.mean(axis=1)).sort_values('m').drop('m', axis=1)