[英]How to sort rows values and replace them by column names on a pandas dataframe
我想對每一行的值進行排序,並用列名替換這些值。 假設下面有數據框。
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)
但這對我不起作用。
您可以使用numpy.argsort
,但首先要通過set_index
獲取列ID
進行index
:
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
想法是對每一行進行排序並獲取結果索引。
df.apply(lambda row: row.sort_values(ascending=False).index, axis=1)
請注意,按行應用時,每行的索引是數據框的列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.