2016-12-13 14 views
-1

各行の値をソートし、列名で値を置き換えたいとします。 以下のデータフレームがあるとします。pandasデータフレームの行の値をソートして列名に置き換える方法

ID A B C 
1 8 10 9 
2 6 7 8 
3 13 14 7 

このフォームに変換します。

1 B C A 
2 c B A 
3 B A C 

pythonで行う方法はありますか?

私はこのような何かに考えています:

df.sort(0, ascending=False) 

しかし、それは私のために動作しません。

+2

210はあなたの努力、私はそれを行うには複雑になると私は尋ねた理由は知っている –

+0

をご提示ください。それを行う機能があれば、このような機能がない場合には助言して、それを行う機能を開発します。だからダウンボートの代わりに助言してください。ありがとう。 –

+0

@NatheerMohammedAbdulwaheed - 私の答えが役に立つなら、[accept](http://meta.stackexchange.com/a/5235/295067)を忘れないでください。ありがとう。 – jezrael

答えて

1

考え方は、各行を並べ替えて結果のインデックスを取得することです。

df.apply(lambda row: row.sort_values(ascending=False).index, axis=1) 

行単位で適用すると、各行のインデックスはデータフレームの列になります。

4

あなたはnumpy.argsortを使用していますが、最初のset_indexによってindexに列IDを取得することができます。

df = df.set_index('ID') 

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

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

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

    0 1 2 
ID   
1 B C A 
2 C B A 
3 B A C  

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

    ID 0 1 2 
0 1 B C A 
1 2 C B A 
2 3 B A C 

必要がオリジナルDataFrameから列を設定した場合:

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

    A B C 
ID   
1 B C A 
2 C B A 
3 B A C   

タイミング

#[3 rows x 3 columns] 

In [97]: %timeit (pd.DataFrame(df.columns[np.argsort(-df.values, axis=1)],index=df.index, columns=df.columns)) 
10000 loops, best of 3: 126 µs per loop 

In [98]: %timeit (df.apply(lambda row: row.sort_values(ascending=False).index, axis=1)) 
1000 loops, best of 3: 1.95 ms per loop 

#[30000 rows x 3 columns] 
df = pd.concat([df]*10000).reset_index(drop=True)  
#print (df) 

df = df.set_index('ID') 

In [103]: %timeit (pd.DataFrame(df.columns[np.argsort(-df.values, axis=1)],index=df.index, columns=df.columns)) 
1000 loops, best of 3: 1.76 ms per loop 

In [104]: %timeit (df.apply(lambda row: row.sort_values(ascending=False).index, axis=1)) 
1 loop, best of 3: 7.21 s per loop    
関連する問題