2017-08-02 5 views
2

データフレームに関するこの問題に直面しているので、Googleで多くの時間を費やした後、ここで質問を開きます。 私はデータフレームを持っています - 、私は降順ですべての行をソートしたい行単位でソートされたデータフレームと元の列ラベル(パンダ)とのマッピング

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_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 

-

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の列インデックスに対応する、以下この構造であり、この問題に対するより単純なライナーの解決法があり、明示的にコーディングする必要はありません。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

作品を使用して、別の方法です! –

+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より大きい値の列インデックスを持つだけで拡張できますか?したがって、2番目の行では、C D Aと空のスペースしか得られません。最後の行でA. –

+0

@ OleiverSのみ、小さなサンプルデータセットと希望するデータセットで新しい質問を開きます。すでに答えられた質問を変更する - 与えられた回答を無効にする – MaxU

2

あなたがnumpy.argsort使用することができます:apply

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 

それともパンダのソリューションを:

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魅力Coldspeed :)多くの多くの感謝のような

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に感謝します。 –

関連する問題