for循环处理pandas数据做货币换算时出现Python scalar错误如何解决
问题产生原因
你的代码存在两处核心问题:
- 你在循环中仅遍历了
risk['AMOUNT']列的数值,每次条件判断时调用的risk['CURRENCY'].item()是对整个CURRENCY列执行操作,而非获取当前行对应的货币类型 - pandas的
item()方法仅支持长度为1的Series转换为Python标量,你的risk['CURRENCY']是包含所有行货币类型的长序列,长度必然大于1,因此触发该ValueError。就算避开报错,原逻辑也无法实现按每行货币类型换算金额的需求。
解决方案
推荐优先使用性能更高的向量化运算方案,无需手写循环:
- 先将货币和对应汇率整理为映射字典,PLN货币的汇率直接设为1即可
rate_map = { 'EUR': eurpln['EURPLN'][0], 'USD': usdpln['USDPLN'][0], 'CHF': chfpln['CHFPLN'][0], 'GBP': gbppln['GBPPLN'][0], 'PLN': 1 }
- 直接通过
map方法匹配汇率后批量计算,一行代码即可得到换算后的PLN金额:
risk['AMOUNT_PLN'] = risk['AMOUNT'] * risk['CURRENCY'].map(rate_map)
如果存在未在rate_map中定义的货币类型,可在map后追加.fillna(1),保证这类货币的金额不会被转换为缺失值。
如果你需要保留原函数的循环写法,修改为逐行遍历即可:
def convert_currency(): lst = [] # 逐行遍历获取当前行的金额和货币类型 for _, row in risk.iterrows(): amount = row['AMOUNT'] currency = row['CURRENCY'] if currency == 'EUR': lst.append(amount * eurpln['EURPLN'][0]) elif currency == 'USD': lst.append(amount * usdpln['USDPLN'][0]) elif currency == 'CHF': lst.append(amount * chfpln['CHFPLN'][0]) elif currency == 'GBP': lst.append(amount * gbppln['GBPPLN'][0]) else: lst.append(amount) return lst
内容的提问来源于stack exchange,提问作者Mateusz Janikowski
相关产品推荐
相关产品推荐

