如何基于条件通过公式将DataFrame中Decimal Odds转为American Odds
问题描述
我有如下DataFrame:
| index | Team A | Team B | Site A | Site B | Odds A | Odds B | Profit % | Bet A | Bet B |
|---|---|---|---|---|---|---|---|---|---|
| 21 | Oklahoma City Thunder | Philadelphia 76ers | FanDuel | DraftKings | 2.26 | 2.35 | 13.2 | 195.79 | 181.08 |
| 23 | Oklahoma City Thunder | Philadelphia 76ers | FanDuel | BetMGM | 2.26 | 2.35 | 13.2 | 195.79 | 181.08 |
| 25 | Oklahoma City Thunder | Philadelphia 76ers | FanDuel | Caesars | 2.26 | 2.35 | 13.2 | 195.79 | 181.08 |
| 27 | Oklahoma City Thunder | Philadelphia 76ers | DraftKings | BetMGM | 2.35 | 2.35 | 14.89 | 181.08 | 181.08 |
其中Odds A和Odds B列为十进制赔率(Decimal Odds),需要按照以下规则转换为美式赔率(American Odds):
- 若赔率值≥2,使用公式:
(Odds-1)*100 - 若赔率值<2,使用公式:
-100/(Odds-1)
请问实现该需求的最佳方式是什么?
解决方案
下面是几种高效实现转换的方法,按推荐程度排序:
方法1:使用numpy.where(最简洁高效)
利用numpy的向量化操作直接处理整列,速度最快,适合大数据量场景:
import numpy as np import pandas as pd # 假设你的DataFrame名为df df['American Odds A'] = np.where(df['Odds A'] >= 2, (df['Odds A'] - 1)*100, -100/(df['Odds A'] - 1)) df['American Odds B'] = np.where(df['Odds B'] >= 2, (df['Odds B'] - 1)*100, -100/(df['Odds B'] - 1))
方法2:自定义转换函数+apply
如果需要复用转换逻辑,可封装成独立函数后用apply处理:
def decimal_to_american(odds): if odds >= 2: return (odds - 1)*100 else: return -100/(odds - 1) df['American Odds A'] = df['Odds A'].apply(decimal_to_american) df['American Odds B'] = df['Odds B'].apply(decimal_to_american)
方法3:使用pandas.Series.map
和apply逻辑类似,语法更紧凑:
df['American Odds A'] = df['Odds A'].map(lambda x: (x-1)*100 if x >=2 else -100/(x-1)) df['American Odds B'] = df['Odds B'].map(lambda x: (x-1)*100 if x >=2 else -100/(x-1))
转换结果示例
处理后新增列的结果(保留两位小数)如下:
| index | American Odds A | American Odds B |
|---|---|---|
| 21 | 126.00 | 135.00 |
| 23 | 126.00 | 135.00 |
| 25 | 126.00 | 135.00 |
| 27 | 135.00 | 135.00 |
内容的提问来源于stack exchange,提问作者Jerel
相关产品推荐
相关产品推荐

