我有一个这样的数据框:
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
。
答案 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