将按行排序的数据框映射到原始列标签(Pandas)
我正面临涉及数据框的此问题,因此在Google上花费大量时间后,我在此处打开一个问题。 我有一个数据帧 -将按行排序的数据框映射到原始列标签(Pandas)
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
应用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
这里是类似于@ 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
Hallo MaxU,你的解决方案同样适用。感谢分享它。 –
只有列值大于0的值才能扩展这个问题吗?所以在第二行我们只得到C D A和空白空间。在最后一行中只有A. –
@OliverS,请用一个小样本数据集和所需的数据集打开一个新问题。更改已经回答的问题 - 使给定的答案无效 – MaxU
您可以使用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
:
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
它也适用于您的其他解决方案。非常感谢。 –
是的,它更快,因为只使用numpy。 – jezrael
这里的另一种方式,利用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
感谢John提供的解决方案。 –
就像一个魅力Coldspeed :)很多很多的感谢! –
@OliverS很高兴能帮到你!记住,如果答案有帮助,你可以[接受](https://stackoverflow.com/help/someone-answers)它。 –
哦!我在这里是一个新手,但现在已经认定它是'接受'的。非常感谢,再次。 –