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

如何基于条件通过公式将DataFrame中Decimal Odds转为American Odds

问题描述

我有如下DataFrame:

indexTeam ATeam BSite ASite BOdds AOdds BProfit %Bet ABet B
21Oklahoma City ThunderPhiladelphia 76ersFanDuelDraftKings2.262.3513.2195.79181.08
23Oklahoma City ThunderPhiladelphia 76ersFanDuelBetMGM2.262.3513.2195.79181.08
25Oklahoma City ThunderPhiladelphia 76ersFanDuelCaesars2.262.3513.2195.79181.08
27Oklahoma City ThunderPhiladelphia 76ersDraftKingsBetMGM2.352.3514.89181.08181.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))

转换结果示例

处理后新增列的结果(保留两位小数)如下:

indexAmerican Odds AAmerican Odds B
21126.00135.00
23126.00135.00
25126.00135.00
27135.00135.00

内容的提问来源于stack exchange,提问作者Jerel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:06:22