商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Pandas 中基于字典映射实现列的最小值计算并新增结果列

Pandas 中基于字典映射实现列的最小值计算并新增结果列

  发布于2026-07-12 阅读(0)

扫一扫,手机访问

本文介绍如何利用 pandas 将字典中定义的转换因子与 dataframe 中对应项的数值进行批量乘法运算,并为每一行计算其可转换项中的最小值,最终作为新列添加到原表中。

说到数据分析中的动态转换,很多场景都离不开“外部映射”这个操作——比如单位换算、价格系数、权重因子,这些映射关系通常以字典形式存在,需要和主表中的数据做批量运算,然后进一步聚合出最小值、最大值之类的统计量。今天咱们就拆解一个典型场景:给定一个转换因子字典 data 和一个主数据表 df,目标是为 df 中每个 Item 计算其“可被转换项”的 Col1 值经系数缩放后的最小值,最后把结果存进新列 Minc_Col1

整个过程其实就四个关键步骤,理解之后会发现 Pandas 的向量化操作非常优雅。

✅ 核心思路解析

  • 对齐映射:字典 data 的行索引(比如 'Item5''Item6')需要和 dfCol0 的值匹配,这样才能拿到对应的 Col1 数值作为基础值。
  • 广播乘法:用 DataFrame.mul(..., axis=0) 沿行方向把 data 的每一行乘以对应的 Col1 值,生成一个转换后的矩阵。
  • 按列求最小:因为 data 的列代表目标项(比如 'Item1''Item2'),所以对乘法结果按列取 min(),就能得到每个目标项能获得的最小转换值。
  • 安全对齐:那些没出现在 data.index 中的 df['Col0'] 项(比如 'Item3''Item5''Item6'),会导致部分乘积变成 NaN,而 min() 默认会跳过 NaN;如果一整列全是 NaN,结果就是 NaN,符合预期。

? 完整实现代码

import pandas as pd# 转换因子字典(行=源项,列=目标项)data = {    'Item1': {'Item5': 10, 'Item6': 100, 'Item4': 1},     'Item2': {'Item5': 10, 'Item6': 100, 'Item4': 1},     'Item4': {'Item5': 10, 'Item6': 100, 'Item9': 1}}data = pd.DataFrame(data).T  # 确保列为目标项,行为源项(与后续 map 对齐)# 主数据表df = pd.DataFrame({    'Col0': ['Item1', 'Item2', 'Item3', 'Item4', 'Item5', 'Item6'],    'Col1': [180, 250, 150, 205, 22, 2],    'Col2': [190, 150, 150, 200, 18, 2.5]})# 步骤1:以 Col0 为索引,便于 map 查找result = df.set_index('Col0')# 步骤2:用 data.index 映射 result['Col1'] 获取各源项的基准值(如 Item5→22)factors = data.index.map(result['Col1'])# 步骤3:广播乘法 + 按列取最小 → 得到每个目标项(Item1/Item2/Item4)的 min converted valuemin_values = data.mul(factors, axis=0).min()# 步骤4:assign 新列,重置索引,重命名列result = (    result.assign(Minc_Col1=min_values)    .reset_index()    .rename(columns={'Col0': 'Item', 'Col1': 'Price1', 'Col2': 'Price2'}))print(result)

输出结果:

    Item  Price1  Price2  Minc_Col10  Item1     180   190.0      200.01  Item2     250   150.0      200.02  Item3     150   150.0        NaN3  Item4     205   200.0      200.04  Item5      22    18.0        NaN5  Item6       2     2.5        NaN

⚠️ 注意事项与常见问题

  • 字典结构关键data 必须是一个 pd.DataFrame,而且它的行索引(index)必须和 df['Col0'] 中的源项完全一致(比如 'Item5''Item6'),否则 map 会返回 NaN,导致整列乘积失效。
  • NaN 处理逻辑min() 默认忽略 NaN;如果某个目标项(比如 'Item1')的所有可转换源项都没有对应的 Col1 值(全 NaN),结果就是 NaN
  • 列名对齐data.columns 应该覆盖所有需要计算 Minc_Col1 的目标项(比如 'Item1''Item2''Item4'),缺失的列不会出现在结果中。
  • 性能提示:这个方法基于向量化运算,处理万级以内的数据完全够用;如果数据量超大,可以考虑用 numba 加速或者分块处理。

? 进阶扩展(可选)

如果还想知道最小值是从哪个源项来的——比如发现 200 是由 'Item6' 贡献的——可以用 idxmin() 来追溯:

m = data.mul(factors, axis=0)min_series = m.min()source_item = m.idxmin()  # 返回每列最小值所在行索引(即源项名)# 合并到结果result = result.assign(    Minc_Col1=min_series,    Source_Item=source_item)

这套方案在可读性、健壮性和扩展性上都表现不错,算是 Pandas 里实现“映射-转换-聚合”类任务的标准套路了。

本文转载于:https://www.php.cn/faq/2812563.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注