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

基于另一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:32:23