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

如何简便获取DataFrame指定列的Top3值及对应STKS列值

问题与解决方案

问题背景

给定如下DataFrame:

import pandas as pd

data = {'PVOL': [190, 105, 100, 150, 100, 170], 'STKS': [2000, 2500, 3000, 3500, 4000, 4500],
'CVOL': [64, 179, 98, 281, 86, 90]}
df = pd.DataFrame(data)

需求:获取除STKS列外所有列的前3大值,同时输出对应的STKS列值,最终格式如下:

PVOL - 2000[190], 4500[170], 3500[150]
CVOL - 3500[281], 2500[179], 3000[98]

用户尝试了以下代码获取前2大值并转换为DataFrame格式,但希望找到更简便的实现方式:

columns_name = list(df.columns)
columns_name.remove('STKS')
data_dict = {}
for col in columns_name:
      temp=[]
      data=df.sort_values(col, ascending=False)[:2][[col,'STKS']].values
      for row in data:
        temp.append(row[1])
        temp.append(row[0])
      data_dict[col]=temp

new_df1=pd.DataFrame(data_dict,index="STK VOL STK VOL".split())
new_df1.set_axis(["PVOL", "CVOL"], axis='columns', inplace=True)
Vol_df = new_df1[["PVOL", "CVOL"]]
print(Vol_df)

简化实现方案

利用pandas的nlargest()函数可以直接获取指定列的前N大值,配合字符串格式化就能快速得到目标输出:

import pandas as pd

data = {'PVOL': [190, 105, 100, 150, 100, 170], 'STKS': [2000, 2500, 3000, 3500, 4000, 4500],
'CVOL': [64, 179, 98, 281, 86, 90]}
df = pd.DataFrame(data)

# 遍历除STKS外的所有列
for col in df.columns.drop('STKS'):
    # 获取当前列前3大值对应的STKS和列值,按列降序排列
    top3 = df.nlargest(3, col)[['STKS', col]]
    # 格式化每一行的输出为"STKS[值]"
    formatted_items = [f"{row['STKS']}[{row[col]}]" for _, row in top3.iterrows()]
    # 拼接成目标格式并打印
    print(f"{col} - {', '.join(formatted_items)}")

代码说明

  1. df.columns.drop('STKS')直接过滤掉不需要的STKS列,无需手动移除,更简洁。
  2. df.nlargest(3, col)直接返回当前列前3大值对应的整行数据,比先排序再切片更高效。
  3. 通过列表推导式将每行的STKS和当前列值格式化为指定字符串,再用', '.join()拼接成最终输出格式。

运行上述代码后,输出结果完全符合需求:

PVOL - 2000[190], 4500[170], 3500[150]
CVOL - 3500[281], 2500[179], 3000[98]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:55:14