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

如何高效获取DataFrame每行中n个最大值对应的列名?

问题描述

现有如下DataFrame数据:

import pandas as pd
import numpy as np

np.random.seed(42)
data = np.random.rand(5,5)
data = pd.DataFrame(data, columns = list('abcde'))

对应的DataFrame内容为:

a         b         c         d         e
0  0.374540  0.950714  0.731994  0.598658  0.156019
1  0.155995  0.058084  0.866176  0.601115  0.708073
2  0.020584  0.969910  0.832443  0.212339  0.181825
3  0.183405  0.304242  0.524756  0.431945  0.291229
4  0.611853  0.139494  0.292145  0.366362  0.456070

需要提取每行中数值最大的n个元素对应的列名(以n=2为例),期望输出如下:

0  b  c
1  c  e
2  b  c
3  c  d
4  a  e

不想通过循环遍历实现(效率低),求更Pythonic的高效实现方式。

解决方案

方法一:Pandas原生简洁实现

利用DataFrame.apply()结合Series.nlargest(),直接提取每行前n大值的列名:

n = 2
# 提取每行前n大值的列名并转为DataFrame
result = data.apply(lambda row: row.nlargest(n).index.tolist(), axis=1).apply(pd.Series)
print(result)

输出结果与期望完全一致,该方法代码简洁直观,适合中小型数据集。

方法二:Numpy向量化操作(高效处理大数据)

当数据集规模较大时,使用Numpy的向量化操作可以避免Python层面的循环,性能优势更明显:

n = 2
# 获取每行前n大值的索引(argpartition仅保证前n个为最大,顺序未排序)
top_indices = np.argpartition(-data.values, n, axis=1)[:, :n]
# 对前n个索引按对应数值从大到小排序
sorted_indices = top_indices[np.arange(len(top_indices))[:, None], 
                             np.argsort(-data.values[np.arange(len(top_indices))[:, None], top_indices])]
# 将索引映射为列名,转为DataFrame
result = pd.DataFrame(data.columns[sorted_indices], index=data.index)
print(result)

该方法依托Numpy的底层优化,处理百万级以上数据时效率显著高于Pandas的apply()方法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:35:20