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与数据集维度不同,部分货币多次出现,不想用遍历的暴力方法,希望通过连接类操作实现。
解决方案
你可以通过索引映射+广播运算或表合并后逐列计算的方式高效解决,无需遍历,具体如下:
方法一:索引映射实现逐行匹配(高效)
- 将汇率表
rates设置以Currency为索引,方便根据货币代码快速定位对应年度汇率:
rates_indexed = rates.set_index("Currency")
- 提取年度列列表,用于批量处理:
year_columns = [2000, 2001, 2002, 2003]
- 对数据集的年度列,按每行的
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
相关产品推荐
相关产品推荐

