pandas如何按行获取数值对应的前3小、前3大关联列名
问题解决方法
报错原因
你之前的代码报错是因为apply返回的每一行是数组格式,不能直接用iloc[:, :3]这种二维索引方式跨行列取元素。
正确实现
方法1:基于numpy的argsort实现
import pandas as pd import numpy as np # 1. 获取每行前3小数值对应的列名 top3_small_cols = df.apply(lambda row: df.columns[np.argsort(row)[:3]], axis=1) # 转换为结构化DataFrame方便查看 top3_small_df = pd.DataFrame( top3_small_cols.to_list(), index=df.index, columns=['第1小列', '第2小列', '第3小列'] ) # 2. 获取每行前3大数值对应的列名 top3_large_cols = df.apply(lambda row: df.columns[np.argsort(row)[-3:][::-1]], axis=1) # 转换为结构化DataFrame方便查看 top3_large_df = pd.DataFrame( top3_large_cols.to_list(), index=df.index, columns=['第1大列', '第2大列', '第3大列'] ) # 合并前3小、前3大结果 result = pd.concat([top3_small_df, top3_large_df], axis=1)
方法2:基于pandas原生方法实现(更易读)
不需要额外引入numpy,逻辑更直观,自动处理同值排序逻辑:
# 1. 前3小列 top3_small_cols = df.apply(lambda row: row.nsmallest(3).index.tolist(), axis=1) # 2. 前3大列 top3_large_cols = df.apply(lambda row: row.nlargest(3).index.tolist(), axis=1)
示例输出参考
对你给出的样例数据,最终输出的result结构如下:
| group | 第1小列 | 第2小列 | 第3小列 | 第1大列 | 第2大列 | 第3小列 |
|---|---|---|---|---|---|---|
| A | shopspend | clothspend | foodspend | music spend | foodspend | clothspend |
| B | shopspend | clothspend | foodspend | music spend | foodspend | clothspend |
| C | shopspend | clothspend | foodspend | music spend | foodspend | clothspend |
| d | shopspend | clothspend | foodspend | music spend | foodspend | clothspend |
内容的提问来源于stack exchange,提问作者Maths12
相关产品推荐
相关产品推荐

