基于Pandas DataFrame按行筛选Top5值列并保留所有行的需求
解决方法:提取每行Top5列并按数值降序排列
我来帮你搞定这个需求!用Pandas就能轻松实现,下面是完整的代码和步骤解释,完全贴合你的要求:
首先,先把你的原始数据转换成可操作的Pandas DataFrame(如果你的数据已经是DataFrame,这步可以跳过):
import pandas as pd # 构建原始数据集 raw_data = { 'id-t': ['id1', 'id2', 'id3', 'id4', 'id5'], 't1': [2, 0, 2, 4, 2], 't2': [4, 5, 0, 2, 0], 't3': [2, 4, 5, 0, 2], 't4': [0, 3, 4, 5, 4], 't5': [5, 5, 4, 3, 2], 't6': [4, 5, 3, 3, 4], 't7': [4, 6, 5, 3, 4], 't8': [4, 7, 5, 4, 5], 't9': [5, 7, 6, 4, 5], 't10': [5, 8, 7, 4, 6], 't11': [5, 9, 7, 4, 6], 't12': [5, 9, 9, 4, 7] } # 将id设为索引,方便后续行级操作 df = pd.DataFrame(raw_data).set_index('id-t')
接下来是核心操作:对每行提取数值最高的5个列名,并按数值从高到低排序:
# 对每行筛选Top5列名(按数值降序) top5_cols_per_row = df.apply(lambda row: row.nlargest(5).index.tolist(), axis=1) # 将结果转换成目标格式的DataFrame result_df = pd.DataFrame(top5_cols_per_row.tolist(), index=top5_cols_per_row.index).T # 调整索引为1-5的排序序号 result_df.index = range(1, 6) # 设置索引名和移除多余的列名索引 result_df.index.name = 'order (highest to lowest)' result_df.columns.name = None
运行后打印result_df就能得到你要的格式:
print(result_df)
输出结果如下:
order (highest to lowest) id1 id2 id3 id4 id5 1 t5 t11 t12 t4 t12 2 t9 t12 t10 t1 t10 3 t10 t10 t11 t8 t11 4 t11 t9 t9 t9 t8 5 t12 t8 t7 t7 t9
关键步骤拆解:
row.nlargest(5):对每行数据筛选出数值最大的5个元素,返回带列名的Series.index.tolist():把Top5元素的列名转换成列表,方便后续格式整理.T转置:将原本"每行对应一个id的Top5列表"转置成"每列对应一个id、每行对应排序位次"的目标格式- 索引调整:把默认的0-4索引改成1-5,匹配你要求的排序序号
内容的提问来源于stack exchange,提问作者somso
相关产品推荐
相关产品推荐

