You need to enable JavaScript to run this app. pandas如何按行获取数值对应的前3小、前3大关联列名
优惠活动
大模型
产品
解决方案
定价
更多

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小列
Ashopspendclothspendfoodspendmusic spendfoodspendclothspend
Bshopspendclothspendfoodspendmusic spendfoodspendclothspend
Cshopspendclothspendfoodspendmusic spendfoodspendclothspend
dshopspendclothspendfoodspendmusic spendfoodspendclothspend

内容的提问来源于stack exchange,提问作者Maths12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 08:54:02