如何有条件地将DataFrame部分数据与Series相乘实现货币转换
非USD币种转换为USD的简洁实现方案
核心思路
通过向量化操作替代逐行遍历,先分离元数据(ISIN、FX)和数值列(日期字段),利用索引匹配汇率后批量计算,彻底规避额外列的干扰。
步骤与代码实现
1. 预处理汇率表
将汇率表的币种设为索引,方便后续通过FX列快速匹配对应汇率:
import pandas as pd # 原始数据定义(用户提供) TimeSerieLCY = pd.DataFrame({'ISIN':['ISIN1', 'ISIN2', 'ISIN3', 'ISIN4', 'ISIN5', 'ISIN6'], '43646':[105.00, 95.600, 105.05, 106.60, 104.99, 98.465], '43676':[103.68, 98.090, 106.60, 106.81, 103.96, 98.339], '43707':[104.03, 101.84, 107.66, 107.22, 102.41, 96.323], 'FX':['USD', 'CNY', 'MYR', 'MYR', 'USD', 'ZAR']}) FXRatesSeries = pd.DataFrame({'Curncy':['CNY', 'MYR', 'ZAR'], '43646':[6.905, 4.190, 19.62], '43676':[6.867, 4.132, 19.15], '43707':[6.884, 4.127, 19.15]}) # 将汇率表设置为以币种为索引 fx_rates = FXRatesSeries.set_index('Curncy')
2. 分离元数据与数值列
把不需要参与计算的ISIN、FX列,和需要转换的日期数值列拆分:
meta_cols = ['ISIN', 'FX'] value_cols = TimeSerieLCY.columns.difference(meta_cols)
3. 批量匹配汇率并完成转换
利用map匹配每行币种对应的汇率序列,再通过向量除法完成转换(USD币种直接保留原值):
# 匹配每行币种对应的汇率序列 rates = TimeSerieLCY['FX'].map(fx_rates.loc[value_cols].to_dict('series')) # 数值列除以对应汇率,USD的NaN用原值填充 usd_values = TimeSerieLCY[value_cols].div(rates, axis=0).fillna(TimeSerieLCY[value_cols]) # 合并元数据与转换后的数据 result = pd.concat([TimeSerieLCY[meta_cols], usd_values], axis=1)
4. 查看转换结果
print(result)
输出结果:
ISIN FX 43646 43676 43707 0 ISIN1 USD 105.000000 103.680000 104.030000 1 ISIN2 CNY 13.845040 14.284258 14.793725 2 ISIN3 MYR 25.071599 25.800097 26.086746 3 ISIN4 MYR 25.441527 25.849468 25.980131 4 ISIN5 USD 104.990000 103.960000 102.410000 5 ISIN6 ZAR 5.018604 5.135196 5.030000
方案优势
- 完全避免逐行遍历,利用pandas向量化操作提升效率,适配大规模数据场景。
- 元数据与数值列分离后,彻底解决额外列干扰计算的问题。
- 核心转换仅通过
map+div两步完成,代码逻辑清晰易维护。
内容的提问来源于stack exchange,提问作者Cairoknox
相关产品推荐
相关产品推荐

