发布于2026-07-12 阅读(0)
扫一扫,手机访问
本文介绍如何利用 pandas 将字典中定义的转换因子与 dataframe 中对应项的数值进行批量乘法运算,并为每一行计算其可转换项中的最小值,最终作为新列添加到原表中。
说到数据分析中的动态转换,很多场景都离不开“外部映射”这个操作——比如单位换算、价格系数、权重因子,这些映射关系通常以字典形式存在,需要和主表中的数据做批量运算,然后进一步聚合出最小值、最大值之类的统计量。今天咱们就拆解一个典型场景:给定一个转换因子字典 data 和一个主数据表 df,目标是为 df 中每个 Item 计算其“可被转换项”的 Col1 值经系数缩放后的最小值,最后把结果存进新列 Minc_Col1。
整个过程其实就四个关键步骤,理解之后会发现 Pandas 的向量化操作非常优雅。
data 的行索引(比如 'Item5'、'Item6')需要和 df 中 Col0 的值匹配,这样才能拿到对应的 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,导致整列乘积失效。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 里实现“映射-转换-聚合”类任务的标准套路了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8