如何获取整个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,提问作者신동범
相关产品推荐
相关产品推荐

