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

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

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

✅ 核心思路解析

? 完整实现代码

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

⚠️ 注意事项与常见问题

? 进阶扩展(可选)

如果还想知道最小值是从哪个源项来的——比如发现 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删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。