基于字典与多列值生成新列:times=2时的取值处理问题
问题:基于多列条件结合字典生成Pandas新列(支持倍数计算)
给定数据
首先是用于匹配费用的字典和目标DataFrame:
import pandas as pd fee = { ('CL', 'SB') :295, ('CL', 'NB') :150, ('BR', 'SB') :120, ('BR', 'NB') :120, ('AR', 'SB') :150, ('AR', 'NB') :150, ('CN', 'SB') :285, ('CN', 'NB') :215, ('MX', 'SB') :115, ('MX', 'NB') :115, ('UK', 'SB') :170, ('UK', 'NB') :120, } dateval= pd.DataFrame({ 'Country': ['CL', 'CL', 'MX', 'UK', 'CN', 'AR', 'AR', 'BR'], 'direction': ['SB', 'NB', 'SB', 'SB', 'NB', 'SB', 'SB', 'NB'], 'times': [1, 1, 1, 2, 1, 2, 1, 2], 'amountdesired': [295,150,115,290,215,300,150,240] })
需求说明
当前代码仅能处理times=1的场景,需要实现:
- 当
times=1时,直接取字典中对应(Country,direction)组合的费用值 - 当
times=2时,取对应字典值的2倍 - 不修改原有fee字典的结构
解决方案1:逐行处理(简洁直观)
使用apply结合lambda函数,直接在每行中完成字典匹配和倍数计算:
dateval['amountdesired'] = dateval.apply( lambda row: fee[(row['Country'], row['direction'])] * row['times'], axis=1 )
解决方案2:分两步计算(性能更优)
对于数据量较大的场景,先通过map批量获取基础费用,再与times列相乘,比逐行apply效率更高:
# 1. 批量获取每个组合的基础费用 dateval['base_fee'] = dateval[['Country', 'direction']].apply(tuple, axis=1).map(fee) # 2. 计算最终金额 dateval['amountdesired'] = dateval['base_fee'] * dateval['times'] # 可选:删除中间生成的base_fee列 dateval.drop('base_fee', axis=1, inplace=True)
验证结果
运行上述代码后,dateval的amountdesired列将符合预期:
Country direction times amountdesired 0 CL SB 1 295 1 CL NB 1 150 2 MX SB 1 115 3 UK SB 2 340 4 CN NB 1 215 5 AR SB 2 300 6 AR SB 1 150 7 BR NB 2 240
内容的提问来源于stack exchange,提问作者Carlos C
相关产品推荐
相关产品推荐

