将按行排序的数据帧映射到原始列标签(Pandas)

时间:2017-08-02 14:23:15

标签: python sorting dataframe row

我正面临涉及数据框架的这个问题,所以在Google上花了很多时间后,我在这里开了一个问题。 我有一个Dataframe -

df 
   A  B  C   D
0  8  3  6   2
1  1 -3  5   2
2  4  9  5  10
3  2 -4 -8  -2

我想按降序排序每一行,但不是保存值,我想保存相应的列名。

排序的数据框看起来像这样 -

df 
       A  B  C   D
    0  8  6  3   2
    1  5  2  1  -3
    2 10  9  5   4
    3  2 -2 -4  -8

我最终想要的是下面的这个结构,,它对应于排序数据框df的列索引 -

df_col 
       1  2  3   4
    0  A  C  B   D
    1  C  D  A   B
    2  D  B  C   A
    3  A  D  B   C

我相信这个问题会有一个更简单的单线解决方案,而无需编写明确的for loop

4 个答案:

答案 0 :(得分:2)

您可以使用numpy.argsort

print (np.argsort(-df.values, axis=1))
[[0 2 1 3]
 [2 3 0 1]
 [3 1 2 0]
 [0 3 1 2]]

print (df.columns[np.argsort(-df.values, axis=1)])
Index([['A', 'C', 'B', 'D'], ['C', 'D', 'A', 'B'], ['D', 'B', 'C', 'A'],
       ['A', 'D', 'B', 'C']],
      dtype='object')

print (pd.DataFrame(df.columns[np.argsort(-df.values, axis=1)], 
                               index=df.index))

   0  1  2  3
0  A  C  B  D
1  C  D  A  B
2  D  B  C  A
3  A  D  B  C

带有apply的pandas解决方案:

print (df.apply(lambda x: x.sort_values(ascending=False).index, axis=1))
   A  B  C  D
0  A  C  B  D
1  C  D  A  B
2  D  B  C  A
3  A  D  B  C

答案 1 :(得分:1)

应用np.argsort,对索引进行排序,然后索引到df.columns

In [129]: pd.DataFrame(df.columns[df.apply(np.argsort, axis=1).T[::-1].T])
Out[129]: 
   0  1  2  3
0  A  C  B  D
1  C  D  A  B
2  D  B  C  A
3  A  D  B  C

答案 2 :(得分:1)

这是一个类似于@ COLDSPEED解决方案的解决方案 - 它使用Series.argsort

In [130]: df.apply(lambda x: df.columns[x.argsort()[::-1]], axis=1)
Out[130]:
   A  B  C  D
0  A  C  B  D
1  C  D  A  B
2  D  B  C  A
3  A  D  B  C

答案 3 :(得分:0)

这是另一种方法,使用argsortapply

In [1000]: np.argsort(-df, axis=1).apply(lambda x: x.index[x], axis=1)
Out[1000]:
   A  B  C  D
0  A  C  B  D
1  C  D  A  B
2  D  B  C  A
3  A  D  B  C