You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

for循环处理pandas数据做货币换算时出现Python scalar错误如何解决

问题产生原因

你的代码存在两处核心问题:

  • 你在循环中仅遍历了risk['AMOUNT']列的数值,每次条件判断时调用的risk['CURRENCY'].item()是对整个CURRENCY列执行操作,而非获取当前行对应的货币类型
  • pandas的item()方法仅支持长度为1的Series转换为Python标量,你的risk['CURRENCY']是包含所有行货币类型的长序列,长度必然大于1,因此触发该ValueError。就算避开报错,原逻辑也无法实现按每行货币类型换算金额的需求。
解决方案

推荐优先使用性能更高的向量化运算方案,无需手写循环:

  1. 先将货币和对应汇率整理为映射字典,PLN货币的汇率直接设为1即可
rate_map = {
    'EUR': eurpln['EURPLN'][0],
    'USD': usdpln['USDPLN'][0],
    'CHF': chfpln['CHFPLN'][0],
    'GBP': gbppln['GBPPLN'][0],
    'PLN': 1
}
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 23:09:00