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

基于字典与多列值生成新列: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:32:28