我正面临涉及数据框架的这个问题,所以在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
答案 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)
这是另一种方法,使用argsort
和apply
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