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

求助:如何基于Dataframe的Currency子串匹配计算Salary_in_INR?

解决DataFrame中按货币类型转换薪资的问题

我有一个名为Test的DataFrame,包含Currency和Salary两列,数据如下:

Currency              Salary
SGD: 2.1  lacs (PA)   2.1   
THB: 3.55 lacs (PA)   3.55  
QAR: 3.12 lacs (PA)   3.12  

需要创建Salary_in_INR列,按以下汇率转换为INR薪资:

  • 1 SGD = 61.37 INR
  • 1 THB = 2.44 INR
  • 1 QAR = 22.43 INR

期望输出:

Currency               Salary     Salary_in_INR
SGD:  2.1 lacs (PA)    2.1        128.87  
THB: 3.55 lacs (PA)    3.55         8.66   
QAR: 3.12 lacs (PA)    3.12         9.98    

原有代码的问题

CODE 1

if 'SGD' in Test['Currency'].values ==True:
    Test['Salary_in_INR'] = Test['Salary'] * 61.37
elif 'THB' in Test['Currency'].values ==True:
    Test['Salary_in_INR'] = Test['Salary'] * 2.44 
else:
    Test['Salary_in_INR'] = Test['Salary'] * 22.43

这段代码逻辑错误:'SGD' in Test['Currency'].values是检查整个列是否存在包含SGD的行,只要有一行满足,就会给所有行统一乘以61.37,无法实现逐行判断货币类型的需求。

CODE 2

if Test['Currency'].str.contains('SGD'):
    Test['Salary_in_INR'] = Test['Salary'] * 61.37
elif Test['Currency'].str.contains('THB'):
    Test['Salary_in_INR'] = Test['Salary'] * 2.44
else:
    Test['Salary_in_INR'] = Test['Salary'] * 22.43

Test['Currency'].str.contains('SGD')返回的是布尔Series(每行对应一个True/False),直接放在if条件中会触发ValueError(Python无法将Series当作单个布尔值判断),同样无法完成逐行转换。

正确解决方案

方法1:使用np.select(推荐,向量化操作效率高)

先定义条件列表和对应汇率,再用np.select逐行匹配计算:

import numpy as np

# 定义匹配条件与对应汇率
conditions = [
    Test['Currency'].str.contains('SGD'),
    Test['Currency'].str.contains('THB'),
    Test['Currency'].str.contains('QAR')
]
rates = [61.37, 2.44, 22.43]

# 计算转换后的薪资并保留两位小数
Test['Salary_in_INR'] = np.select(conditions, rates, default=0) * Test['Salary']
Test['Salary_in_INR'] = Test['Salary_in_INR'].round(2)

方法2:提取货币代码后映射汇率

先从Currency列提取货币代码,再用字典映射汇率计算:

# 提取冒号前的货币代码并去除空格
Test['Currency_Code'] = Test['Currency'].str.split(':').str[0].str.strip()

# 定义汇率字典
exchange_rates = {'SGD':61.37, 'THB':2.44, 'QAR':22.43}

# 计算转换薪资并保留两位小数
Test['Salary_in_INR'] = Test['Salary'] * Test['Currency_Code'].map(exchange_rates)
Test['Salary_in_INR'] = Test['Salary_in_INR'].round(2)

# 可选:删除临时生成的Currency_Code列
# Test.drop('Currency_Code', axis=1, inplace=True)

方法3:使用apply逐行处理(适合简单场景)

exchange_rates = {'SGD':61.37, 'THB':2.44, 'QAR':22.43}

def convert_to_inr(row):
    for code, rate in exchange_rates.items():
        if code in row['Currency']:
            return round(row['Salary'] * rate, 2)
    return 0

Test['Salary_in_INR'] = Test.apply(convert_to_inr, axis=1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:30:36