如何在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
相关产品推荐
相关产品推荐

