高效实现Pandas DataFrame基于字典映射计算新增列
百万级Pandas DataFrame高效计算TOTAL_COST列的方案
对于百万级别的DataFrame,最高效的实现方式是用Pandas向量化操作——全程依赖底层基于C实现的NumPy/Pandas内置函数,完全避免Python层面的循环或apply(apply本质是逐行调用Python函数,速度会慢几个数量级)。
核心思路
- 将系数字典转换成与DataFrame列名匹配的Series,实现自动列对齐
- 提取对应列与系数相乘,按行求和得到每行的系数总和
- 用系数总和乘以
COST列,得到最终的TOTAL_COST
代码实现
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'ID': [1,2,3,4], 'COST': [362,269,346,342], '1F': [0,0,1,0], '2F': [1,1,1,0], '3F': [1,0,1,0], '4G': [1,0,1,0] }) # 系数字典 total_cost = {'1F': 0.047,'2F': 0.03,'3F': 0.023,'4G': 0.025} # 转换为与列匹配的系数Series coeffs = pd.Series(total_cost) # 高效计算TOTAL_COST df['TOTAL_COST'] = df[coeffs.index].mul(coeffs).sum(axis=1) * df['COST'] # 输出结果 print(df)
结果验证
运行后得到的DataFrame与预期完全一致:
| ID | COST | 1F | 2F | 3F | 4G | TOTAL_COST |
|---|---|---|---|---|---|---|
| 1 | 362 | 0 | 1 | 1 | 1 | 28.236 |
| 2 | 269 | 0 | 1 | 0 | 0 | 8.07 |
| 3 | 346 | 1 | 1 | 1 | 1 | 43.25 |
| 4 | 342 | 0 | 0 | 0 | 0 | 0 |
额外说明
如果系数字典中存在DataFrame没有的列名,可以先过滤掉不匹配的键,避免报错:
coeffs = pd.Series(total_cost) coeffs = coeffs[coeffs.index.isin(df.columns)]
内容的提问来源于stack exchange,提问作者Scope
相关产品推荐
相关产品推荐

