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

如何获取整个DataFrame中前n大/小值的索引、列名及关联名称?

实现方案

核心思路

  • 先合并所有结构相同的DataFrame,统一处理全量数据
  • 重构数据格式,将分散的4组值列、对应name列配对转换为长表结构,对齐每个数值的关联属性
  • 基于长表直接全局排序筛选最大/最小的n条记录

完整代码实现

import pandas as pd

# 配置项:你要查询的前n个最大/最小值
n = 4
# 值列与对应name列的映射关系
col_pair = {
    "A": "nameA",
    "B": "nameB",
    "C": "nameC",
    "D": "nameD"
}

# 1. 合并所有DataFrame,可选添加source_df_id标记区分数据来源
for df_idx, df in enumerate(df_list):
    df["source_df_id"] = df_idx
all_data = pd.concat(df_list, ignore_index=False)

# 2. 转换为长表结构,配对数值列和对应name列
long_df = pd.DataFrame()
for val_col, name_col in col_pair.items():
    # 提取当前组的两列数据,补充属性标记
    tmp = all_data[[name_col, val_col, "source_df_id"]].copy()
    tmp["value_column"] = val_col
    # 提取name列前3位转为整数
    tmp["name_prefix"] = tmp[name_col].astype(str).str[:3].astype(int)
    tmp = tmp.rename(columns={val_col: "target_value"})
    long_df = pd.concat([long_df, tmp], ignore_index=False)

# 3. 筛选全局最大/最小的n条记录
largest_n = long_df.nlargest(n, "target_value", keep="first").reset_index(names="original_row_index")
smallest_n = long_df.nsmallest(n, "target_value", keep="first").reset_index(names="original_row_index")

# 合并结果(可选)
result = pd.concat([
    largest_n.assign(type="top_largest"),
    smallest_n.assign(type="top_smallest")
], ignore_index=True)[["type", "source_df_id", "original_row_index", "value_column", "target_value", "name_prefix"]]

# 输出结果
print(result)

结果说明

输出的result包含你需要的所有字段:

  • type:标记是前n大还是前n小值
  • source_df_id:标记该记录来自输入列表中第几个DataFrame,不需要可删除
  • original_row_index:该记录在原DataFrame中的行索引
  • value_column:数值所属的列名(A/B/C/D)
  • target_value:具体的数值
  • name_prefix:对应name列的前3位整数

注意事项

  • 如果存在重复值,可调整nlargest/nsmallest的keep参数:keep="first"保留先出现的,keep="last"保留后出现的,keep="all"保留所有重复值(此时返回记录数可能大于n)
  • 如果name列存在长度不足3位的情况,可根据需求补充截取逻辑,比如不足3位补0、直接保留原始值等

内容的提问来源于stack exchange,提问作者신동범

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:36:03