基于字典条件为DataFrame创建referral_fee列的技术求助
问题:基于混合类型字典生成DataFrame的referral_fee列
需要为包含ASIN、category、price列的DataFrame新增referral_fee列,规则由以下字典定义——部分类别是固定比例,部分是依赖价格的lambda函数:
referral_fees = { "Amazon Device Accessories": 0.45, "Appliances - Compact": lambda price: 0.15 if 0 < price <= 300 else 0.08, "Appliances - Full-size": 0.08, "Automotive and Powersports": 0.12, "Base Equipment Power Tools": 0.12, "Baby Products": lambda price: 0.08 if 0 < price <= 10 else 0.15}
原始数据:
| ASIN | category | price |
|---|---|---|
| 1 | Appliances - Compact | 250 |
| 2 | Appliances - Compact | 400 |
| 3 | Automotive and Powersports | 500 |
| 4 | Baby Products | 9 |
| 5 | Baby Products | 12 |
| 6 | Appliances - Full-size | 275 |
预期生成含referral_fee列的结果:
| ASIN | category | price | referral_fee |
|---|---|---|---|
| 1 | Appliances - Compact | 250 | 0.15 |
| 2 | Appliances - Compact | 400 | 0.08 |
| 3 | Automotive and Powersports | 500 | 0.12 |
| 4 | Baby Products | 9 | 0.08 |
| 5 | Baby Products | 12 | 0.15 |
| 6 | Appliances - Full-size | 275 | 0.08 |
之前尝试的问题
- 直接使用
df["referral_fee"] = df["category"].map(referral_fees):结果列出现函数对象(如<function <lambda> at 0x000001EAFE8CE040>),而非计算后的数值。 - 自定义函数触发
unhashable type: 'Series'错误:原因是尝试用Series作为字典键,无法匹配。
解决方案
方法1:逐行处理(最直观)
定义函数判断规则类型,用apply遍历每行计算:
def calculate_referral_fee(row): rule = referral_fees[row['category']] return rule(row['price']) if callable(rule) else rule df['referral_fee'] = df.apply(calculate_referral_fee, axis=1)
方法2:分离固定/动态规则(性能更优)
先填充固定比例,再单独处理需要计算的类别:
# 拆分固定比例和动态计算规则 fixed_rules = {k: v for k, v in referral_fees.items() if not callable(v)} dynamic_rules = {k: v for k, v in referral_fees.items() if callable(v)} # 填充固定比例 df['referral_fee'] = df['category'].map(fixed_rules) # 处理动态计算的类别 for cat, func in dynamic_rules.items(): mask = df['category'] == cat df.loc[mask, 'referral_fee'] = df.loc[mask, 'price'].apply(func)
方法3:一行式简化写法
如果偏好简洁代码,直接在apply中嵌入逻辑:
df['referral_fee'] = df.apply( lambda r: referral_fees[r['category']](r['price']) if callable(referral_fees[r['category']]) else referral_fees[r['category']], axis=1 )
内容的提问来源于stack exchange,提问作者Chandrashekhar Bagul
相关产品推荐
相关产品推荐

