如何根据idxmax对数据帧进行排序?

时间:2016-01-31 20:50:22

标签: python sorting pandas

我有一个这样的数据框:

    A  B   C
0   1  2   1
1   3 -8  10
2  10  3 -20
3  50  7   1

我想根据每列中最大绝对值的索引重新排列其列。在列A中,最大绝对值位于第3行,B位于第1行,C位于第2行,这意味着我的新数据帧应按顺序排列{ {1}}。

目前我这样做如下:

B C A

因此,我首先确定存储在import pandas as pd import numpy as np df = pd.DataFrame({'A': [1, 3, 10, 50], 'B': [2, -8, 3, 7], 'C': [1, 10, -20, 1]}) indMax = abs(df).idxmax(axis=0) df = df[np.argsort(indMax)] 中的每列最大值的索引,然后对其进行排序并相应地重新排列数据帧,从而为我提供所需的输出:

indMax

我的问题是,是否有可能将函数 B C A 0 2 1 1 1 -8 10 3 2 3 -20 10 3 7 1 50 直接传递给idxmax函数并更改数据框sort

2 个答案:

答案 0 :(得分:1)

IIUC以下是你想要的:

In [69]

df.ix[:,df.abs().idxmax().sort_values().index]
Out[69]:
   B   C   A
0  2   1   1
1 -8  10   3
2  3 -20  10
3  7   1  50

在这里,我们确定idxmax值中的abs,对值进行排序并传递索引以索引df。

至于排序,您只需分配回df。

对于预0.17.0版本,以下作品:

In [75]:
df.ix[:,df.abs().idxmax().sort(inplace=False).index]

Out[75]:
   B   C   A
0  2   1   1
1 -8  10   3
2  3 -20  10
3  7   1  50

答案 1 :(得分:1)

这很难看,但似乎可以使用reindex_axis

import numpy as np

>>> df.reindex_axis(df.columns[list(np.argsort(abs(df).idxmax(axis=0)))], axis=1)
    B   C   A
0   2   1   1
1   -8  10  3
2   3   -20     10
3   7   1   50