【问题标题】:Pandas select value in one dataframe, based on value in other dfPandas 根据其他 df 中的值在一个数据框中选择值
【发布时间】:2018-05-05 16:50:28
【问题描述】:

df1:

         GAME  PLAY  BET
0  (SWE, FIN)  DRAW   10
1  (DEN, GER)   WIN   20
2  (RUS, CZE)  LOSS   30

df2:

     GAME   WIN  DRAW   LOSS
0  (SWE, FIN)  1.50   2.0   3.25
1  (DEN, GER)  2.00   2.5   2.10
2  (RUS, CZE)  1.05   2.1  10.00

我想在 df1 中为每个游戏创建一个“PAYOFF”列。通过从 df2 中获取实际赔率(赢/平/输),通过将该值乘以 df1 中的“BET”来计算收益。例如,对于第 1 行 (SWE,FIN),PLAY 是 DRAW,我需要使用该值从 df2 中的 DRAW col 中获取。
我可以通过加入 2 个 df 来管理它,然后在多个步骤中对列进行一些丑陋的删除/重命名,但我肯定错过了一些更优雅的方法吗? TIA,--汤米

【问题讨论】:

  • 您能否举例说明您对所提供数据的期望输出?
  • 对于 df1 中的每一行,我想计算 BET 乘以 df2 的相应赔率,在三个单独的列中给出。因此,例如,对于 df1 第 0 行,游戏是 DRAW,我将从 df2, row0 中获取 DRAW 列中的值 2.0,然后将其与第 0 行 df1 的 BET 值 10 相乘.对 df1 中的所有行都这样做。请注意,df1 中的行数可能比 df2 中的多,例如,在 SWE-FIN 游戏中可能有几种不同的赌注...
  • @Pryderide 不客气。请注意,表格的每一行之前需要 4 个空格。

标签: python pandas dataframe join


【解决方案1】:

我觉得需要lookup

df1['New']=df2.set_index('GAME').lookup(df1.GAME,df1.PLAY)
df1
Out[26]: 
        GAME  PLAY  BET   New
0  (SWE,FIN)  DRAW   10   2.0
1  (DEN,GER)   WIN   20   2.0
2  (RUS,CZE)  LOSS   30  10.0

【讨论】:

  • 这是一个不错的解决方案。不知道lookup
  • @文美丽!谢谢!
  • @Pryderide yw :-) 快乐编码
【解决方案2】:

我更喜欢 Wen 的解决方案,但你可以使用

merged = pd.merge(
    pd.concat([df1, pd.get_dummies(df1.PLAY)], axis=1),
    df2,
    on='GAME')
>>> merged.BET * (merged.DRAW_x * merged.DRAW_y + merged.WIN_x * merged.WIN_y + merged.LOSS_x * merged.LOSS_y)
0     20.0
1     40.0
2    300.0
dtype: float64

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    相关资源
    最近更新 更多