2017-08-02 76 views
2

我正面临涉及数据框的此问题,因此在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

回答

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 
+0

就像一个魅力Coldspeed :)很多很多的感谢! –

+0

@OliverS很高兴能帮到你!记住,如果答案有帮助,你可以[接受](https://stackoverflow.com/help/someone-answers)它。 –

+0

哦!我在这里是一个新手,但现在已经认定它是'接受'的。非常感谢,再次。 –

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 
+0

Hallo MaxU,你的解决方案同样适用。感谢分享它。 –

+0

只有列值大于0的值才能扩展这个问题吗?所以在第二行我们只得到C D A和空白空间。在最后一行中只有A. –

+0

@OliverS,请用一个小样本数据集和所需的数据集打开一个新问题。更改已经回答的问题 - 使给定的答案无效 – MaxU

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

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 
+0

它也适用于您的其他解决方案。非常感谢。 –

+0

是的,它更快,因为只使用numpy。 – jezrael

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 
+0

感谢John提供的解决方案。 –

相关问题