You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame中获取每行数值最大的3个列名

获取Pandas DataFrame每行数值最大的3个列名

示例数据构建

先创建包含目标列的示例DataFrame:

import pandas as pd

data = {
    "carbohydrates": [10, 25, 15],
    "Proteins": [15, 20, 5],
    "Fats and Oil": [30, 10, 25],
    "Vitamins": [25, 15, 20],
    "Minerals": [20, 25, 18]
}
df = pd.DataFrame(data)

方法一:简洁的apply + nlargest(适合小数据集)

通过apply逐行处理,利用nlargest直接提取前3大值对应的列名:

# 生成每行前3大值的列名列表
top_3_cols = df.apply(lambda row: row.nlargest(3).index.tolist(), axis=1)

# 将结果添加为DataFrame的新列
df["top_3_nutrients"] = top_3_cols

执行后查看结果:

print(df["top_3_nutrients"])
# 输出:
# 0    [Fats and Oil, Vitamins, Minerals]
# 1    [carbohydrates, Minerals, Proteins]
# 2    [Fats and Oil, Vitamins, Minerals]
# Name: top_3_nutrients, dtype: object

方法二:矢量化处理(适合大数据集)

如果数据集规模较大,apply的逐行处理效率较低,可使用矢量化方法提升速度:

# 获取每行数值从大到小排序后的列索引
sorted_indices = df.values.argsort(axis=1)[:, ::-1]
# 映射索引到列名,取前3个并转为列表
top_3_cols = pd.DataFrame(df.columns[sorted_indices[:, :3]], index=df.index).apply(list, axis=1)

df["top_3_nutrients"] = top_3_cols

说明

  • nlargest(3)会筛选出该行数值最大的3个元素,.index直接获取对应的列名;
  • 矢量化方法通过argsort一次性完成所有行的排序索引计算,避免逐行循环,处理百万级数据时优势明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:01:36