Pandas: 按列的平均值排序

28
我在Pandas中有一个数据框,我想根据其列的平均值(或例如它们的std值)对其进行排序(即获得一个新的数据框或视图)。文档谈到了按标签或值排序,但我找不到任何关于自定义排序方法的内容。
我该如何做到这一点?
3个回答

58
你可以使用DataFrame的mean方法和Series的sort_values方法:meansort_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`,但是在 0.17 中废弃了 `order`,以便更符合其他排序方法的一致性。此外,在早期版本中,必须使用 `reindex_axis` 而不是 `reindex`。

3
似乎 order 已经被弃用,应该使用在0.17.0版本中添加的 sort_values 代替。 - bli
@bli 谢谢!我真的需要编写一个脚本来更新我所有的pandas答案(我怀疑有几百个需要更新)... - Andy Hayden
2
sort_values(ascending=False) 如果您想要降序排序 - Krzysztof Słowiński
1
我建议使用reindex而不是reindex_axis,因为它被标记为过时的,并且在将来的版本中将被删除(我正在使用pandas v0.23.4)。 - dvitsios
谢谢@dvitsios,我已经根据您的建议更新了这个答案! - Andy Hayden

9
你可以使用 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)

.mean(axis=1) 找到行的平均值,而不是列。 - Brady Gilg

0

修改自Adriel M. Vieira:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接