如何从Pandas DataFrame按行提取前3大值并绑定对应列名
实现方案
你之前直接对df1排序得不到正确结果,是因为df1存储的是字符串类型,排序会按字符串的ASCII编码规则而非原始数值大小,你可以用以下两种方法实现需求:
方法1:基于原始df直接生成目标结果(更简洁)
import pandas as pd # 构造原始数据 data=[[4.12,3,2],[1.0123123,-6.12312,5.123123],[-3.123123,-8.512323,6.12313]] df = pd.DataFrame(data,columns =['a','b','c'],index=['aa','bb','cc']) # 按行处理:先按数值降序排序,再拼接成「值=列名」格式 def process_row(row): sorted_cols = row.sort_values(ascending=False).index return [f"{row[col]}={col}" for col in sorted_cols] final_df = df.apply(process_row, axis=1, result_type='expand') final_df.columns = ['max=1', 'max=2', 'max=3']
输出的final_df完全符合需求:
max=1 max=2 max=3 aa 4.12=a 3.0=b 2.0=c bb 5.123123=c 1.0123123=a -6.12312=b cc 6.12313=c -3.123123=a -8.512323=b
方法2:基于已生成的df1处理
如果你已经提前生成了拼接好的df1,可以基于原始df的排序规则调整df1的列顺序:
# 已生成的df1 df1 = df.astype(str).apply(lambda x:x+'='+x.name) # 按原始df的数值排序结果重排df1每行的元素 final_df = df1.apply( lambda row: row[df.loc[row.name].sort_values(ascending=False).index], axis=1 ) final_df.columns = ['max=1', 'max=2', 'max=3']
内容的提问来源于stack exchange,提问作者Rajeev Dubey
相关产品推荐
相关产品推荐

