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

Pandas条件乘法:多维度货币汇率转换为USD的实现问题

将本地货币数据转换为对应年度USD

问题描述

我是Pandas(乃至数据科学)新手,希望将各年度本地货币数据转换为USD,需将每个数据点与对应汇率相乘。现有数据结构如下:

import pandas as pd

dataset = pd.DataFrame([
            ["CNY", 321.4, 123.3, 2131, 2134],
            ["EUR", 2144, 3521, 3152, 6421],
            ["CNY", 9999, 1234, 96, 879]],
            columns=["Currency", 2000, 2001, 2002, 2003]) 
rates = pd.DataFrame([
            ["CNY", 6.1, 6.8, 7.4, 5.8],
            ["EUR", 1.1, 1.0, 2.5, 3.1]], 
            columns=["Currency", 2000, 2001, 2002, 2003]) 

需求是在货币代码匹配的前提下,将2000、2001、2002、2003列的年度数值与对应汇率相乘。曾看到类似问题使用where()函数解决,但该示例中两个DataFrame维度相同可直接相乘,而我的汇率DataFrame与数据集维度不同,部分货币多次出现,不想用遍历的暴力方法,希望通过连接类操作实现。

解决方案

你可以通过索引映射+广播运算或表合并后逐列计算的方式高效解决,无需遍历,具体如下:

方法一:索引映射实现逐行匹配(高效)

  1. 将汇率表rates设置以Currency为索引,方便根据货币代码快速定位对应年度汇率:
rates_indexed = rates.set_index("Currency")
  1. 提取年度列列表,用于批量处理:
year_columns = [2000, 2001, 2002, 2003]
  1. 对数据集的年度列,按每行的Currency匹配对应的汇率行,逐元素相乘:
# 计算转换后的USD数据
usd_data = dataset[year_columns].mul(
    dataset["Currency"].apply(lambda x: rates_indexed.loc[x]), axis=0
)

# 合并原货币列与转换结果
result = pd.concat([dataset["Currency"], usd_data], axis=1)

方法二:表合并后逐列计算(直观)

如果觉得映射方式不好理解,可先将两个表按Currency合并,再逐列计算:

# 合并数据集与汇率表,保留所有dataset的行
merged = dataset.merge(rates, on="Currency", suffixes=("_local", "_rate"))

# 逐年度计算转换后的值
for year in year_columns:
    merged[year] = merged[f"{year}_local"] * merged[f"{year}_rate"]

# 保留需要的最终列
result = merged[["Currency"] + year_columns]

两种方法均能得到符合需求的结果,第一种更高效,适合大数据量场景;第二种逻辑更直观,适合新手理解。运行后result的输出示例:

Currency      2000      2001       2002       2003
0      CNY   1960.54    838.44    15769.4    12377.2
1      EUR   2358.40    3521.00    7880.00    19905.1
2      CNY  60993.90    8391.20      710.4     5098.2

内容的提问来源于stack exchange,提问作者General Lol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:07:41