あなたは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
210はあなたの努力、私はそれを行うには複雑になると私は尋ねた理由は知っている –
をご提示ください。それを行う機能があれば、このような機能がない場合には助言して、それを行う機能を開発します。だからダウンボートの代わりに助言してください。ありがとう。 –
@NatheerMohammedAbdulwaheed - 私の答えが役に立つなら、[accept](http://meta.stackexchange.com/a/5235/295067)を忘れないでください。ありがとう。 – jezrael