簡體   English   中英

如何對行值進行排序並將其替換為熊貓數據框上的列名

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM