获取 Pandas 数据框中列名的排名

den*_*den 5 python dataframe pandas

我已经将客户 ID 与他们最常购买的表演类型进行了对比:

Genre            Jazz     Dance     Music  Theatre
Customer                                        
100000000001           0      3         1        2
100000000002           0      1         6        2
100000000003           0      3        13        4
100000000004           0      5         4        1
100000000005           1     10        16       14
Run Code Online (Sandbox Code Playgroud)

我想要的结果是根据排名附加列名:

Genre            Jazz     Dance     Music  Theatre          Rank1          Rank2          Rank3          Rank4
Customer                                         
100000000001           0      3         1        2          Dance        Theatre          Music           Jazz
100000000002           0      1         6        2          Music        Theatre          Dance           Jazz
100000000003           0      3        13        4          Music        Theatre          Dance           Jazz
100000000004           0      5         4        1          Dance          Music        Theatre           Jazz
100000000005           1     10        16       14          Music        Theatre          Dance           Jazz
Run Code Online (Sandbox Code Playgroud)

我查了一些线索,但我能找到的最接近的东西是idxmax. 然而,这只给了我Rank1

谁能帮我得到我需要的结果?

非常感谢!

丹尼斯

Shu*_*rma 5

使用:

i = np.argsort(df.to_numpy() * -1, axis=1)
r = pd.DataFrame(df.columns[i], index=df.index, columns=range(1, i.shape[1] + 1)) 
df = df.join(r.add_prefix('Rank'))
Run Code Online (Sandbox Code Playgroud)

细节:

使用np.argsort沿来获取按降序对流派进行排序的axis=1索引。i

print(i)
array([[1, 3, 2, 0],
       [2, 3, 1, 0],
       [2, 3, 1, 0],
       [1, 2, 3, 0],
       [2, 3, 1, 0]])
Run Code Online (Sandbox Code Playgroud)

从沿索引(即)获取的r数据帧的列创建一个新的数据帧,然后使用以下命令连接数据帧:dfidf.columns[i]DataFrame.joinrdf

print(df)
              Jazz  Dance  Music  Theatre  Rank1    Rank2    Rank3 Rank4
Customer                                                                
100000000001     0      3      1        2  Dance  Theatre    Music  Jazz
100000000002     0      1      6        2  Music  Theatre    Dance  Jazz
100000000003     0      3     13        4  Music  Theatre    Dance  Jazz
100000000004     0      5      4        1  Dance    Music  Theatre  Jazz
100000000005     1     10     16       14  Music  Theatre    Dance  Jazz
Run Code Online (Sandbox Code Playgroud)