如何调用字典值为DataFrame创建匹配金属成本规则的布尔列
实现方法
报错原因
你遇到的两个报错对应两个常见的误用场景:
ValueError: Lengths must match to compare:是因为你直接将16个元素的成本上限列表和全表9999行的Total Cost列做逐行比较,两个序列长度不一致,无法对应运算TypeError: 'Series' objects are mutable, thus they cannot be hashed:是因为你在使用apply或者查询方法时,错误地将整列Series对象作为键传入字典查询,字典要求键为不可变类型,Series是可变对象无法作为哈希键使用
正确实现(性能最优方案)
首先将你给出的Cost_ranges转换为「金属-成本上限」的映射字典,再用map方法将每行的Metal值映射为对应成本上限,最后做逐行比较即可,不需要用循环或者apply,性能远高于逐行处理方法。
import pandas as pd # 1. 转换为金属到成本上限的映射字典 metal_limit_map = dict(zip(Cost_ranges['Metals'], Cost_ranges['Cost Maximum'])) # 2. 新增布尔列,按规则判定 df_Cost['is_over_cost_limit'] = df_Cost['Total Cost'] >= df_Cost['Metal'].map(metal_limit_map)
可选:异常值兼容
如果你的表中存在不在给出金属列表中的异常值,可以补充填充默认值避免生成空值:
# 不在列表中的金属默认成本上限设为无穷大,判定结果为False,可根据需求调整 df_Cost['is_over_cost_limit'] = df_Cost['Total Cost'] >= df_Cost['Metal'].map(metal_limit_map).fillna(float('inf'))
内容的提问来源于stack exchange,提问作者WoolyFox
相关产品推荐
相关产品推荐

