基于另一DataFrame值在Pandas中为df1生成PAYOFF列
嗨,咱们一步步来解决这个问题。你需要给df1新增一个PAYOFF列,规则是根据每行的PLAY值从df2对应行取出同名字段的赔率,再乘以BET金额。这里有几个简单好用的Pandas方案,完全适配你的需求:
方案1:用df.lookup()(最简洁高效)
这个方法是Pandas专门为「按行+列名匹配取值」设计的,语法简洁且性能出色,完美匹配你的场景:
import pandas as pd # 构造你提供的两个DataFrame df1 = pd.DataFrame({ 'GAME': ['(SWE, FIN)', '(DEN, GER)', '(RUS, CZE)'], 'PLAY': ['DRAW', 'WIN', 'LOSS'], 'BET': [10, 20, 30] }) df2 = pd.DataFrame({ 'GAME': ['(SWE, FIN)', '(DEN, GER)', '(RUS, CZE)'], 'WIN': [1.50, 2.00, 1.05], 'DRAW': [2.0, 2.5, 2.1], 'LOSS': [3.25, 2.10, 10.00] }) # 计算PAYOFF列:lookup按行+列名取赔率,再乘以BET df1['PAYOFF'] = df2.lookup(df2.index, df1['PLAY']) * df1['BET']
运行后df1的结果如下:
GAME PLAY BET PAYOFF 0 (SWE, FIN) DRAW 10 20.0 1 (DEN, GER) WIN 20 40.0 2 (RUS, CZE) LOSS 30 300.0
方案2:用apply()逐行处理(逻辑更直观)
如果觉得lookup的语法有点抽象,也可以用apply逐行处理,逻辑一目了然(适合小数据集,大数据集性能略逊于lookup):
df1['PAYOFF'] = df1.apply( lambda row: df2.loc[df2['GAME'] == row['GAME'], row['PLAY']].values[0] * row['BET'], axis=1 )
解释:apply会遍历df1的每一行,先通过GAME匹配df2的对应行,再取出PLAY字段对应的赔率值,最后和当前行的BET相乘得到结果。
方案3:转长格式后合并(扩展性更强)
如果后续需要对玩法(WIN/DRAW/LOSS)做更多分析,推荐把df2转成「长格式」后再和df1合并,这种方法结构更清晰,扩展性更好:
# 将df2转成长格式:把WIN/DRAW/LOSS列转为PLAY的取值,保留赔率 df2_long = df2.melt(id_vars='GAME', var_name='PLAY', value_name='ODDS') # 和df1按GAME、PLAY合并,然后计算PAYOFF df_merged = pd.merge(df1, df2_long, on=['GAME', 'PLAY'], how='left') df_merged['PAYOFF'] = df_merged['BET'] * df_merged['ODDS'] # 把结果赋值回df1 df1['PAYOFF'] = df_merged['PAYOFF']
方案选择建议
- 优先选方案1:简洁高效,专门适配这类取值场景;
- 小数据集或需要直观逻辑选方案2;
- 后续有更多玩法分析需求选方案3。
内容的提问来源于stack exchange,提问作者Pryderide
相关产品推荐
相关产品推荐

