求助:如何基于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
相关产品推荐
相关产品推荐

