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

分数格式赔率转换错误及Pandas数据类型识别问题求助

赔率分数转浮点数及Pandas类型识别问题

问题描述

我有一个包含分数格式赔率的Pandas DataFrame,需要将分数转换为「分数值+1」的浮点数格式。当前使用自定义转换函数后,结果比预期小1;同时发现DataFrame中的167/50等分数字符串被识别为float64类型,对此存在疑问。

原始DataFrame

df:
   Unnamed: 0  country      league home_odds draw_odds away_odds             datetime      home_team           away_team  home_score  away_score
0      381084  Iceland  League Cup    167/50   329/100    63/100  2016-02-16 19:15:00      Kopavogur  Vikingur Reykjavik           0           1
1      381085  Iceland  League Cup   463/100    173/50    47/100  2016-02-14 21:15:00           Fram            Stjarnan           0           3
2      381086  Iceland  League Cup      9/25     99/25    303/50  2016-02-14 19:15:00   KR Reykjavik              Haukar           1           1
3      381087  Iceland  League Cup      9/25   393/100   611/100  2016-02-14 19:00:00  Thor Akureyri          Leiknir F.           5           0
4      381088  Iceland  League Cup     11/25   353/100    251/50  2016-02-14 17:00:00        Akranes           Grindavik           5           0

当前转换代码

def convert(s):
    if '/' in str(s):  # is a fraction
        num, den = s.split('/')
        return 1 + int(num) / int(den)
    else:
        return float(s)

odds_cols = ['home_odds', 'draw_odds', 'away_odds']

df[odds_cols] = df[odds_cols].applymap(convert)

当前转换结果

Unnamed: 0  country      league  home_odds  draw_odds  away_odds             datetime      home_team           away_team  home_score  away_score
0      381084  Iceland  League Cup       3.34       3.29       0.63  2016-02-16 19:15:00      Kopavogur  Vikingur Reykjavik           0           1
1      381085  Iceland  League Cup       4.63       3.46       0.47  2016-02-14 21:15:00           Fram            Stjarnan           0           3
2      381086  Iceland  League Cup       0.36       3.96       6.06  2016-02-14 19:15:00   KR Reykjavik              Haukar           1           1
3      381087  Iceland  League Cup       0.36       3.93       6.11  2016-02-14 19:00:00  Thor Akureyri          Leiknir F.           5           0
4      381088  Iceland  League Cup       0.44       3.53       5.02  2016-02-14 17:00:00        Akranes           Grindavik           5           0

预期转换结果

Unnamed: 0  country      league  home_odds  draw_odds  away_odds             datetime      home_team           away_team  home_score  away_score
0      381084  Iceland  League Cup       4.34       4.29       1.63  2016-02-16 19:15:00      Kopavogur  Vikingur Reykjavik           0           1
1      381085  Iceland  League Cup       5.63       4.46       1.47  2016-02-14 21:15:00           Fram            Stjarnan           0           3
2      381086  Iceland  League Cup       1.36       4.96       7.06  2016-02-14 19:15:00   KR Reykjavik              Haukar           1           1
3      381087  Iceland  League Cup       1.36       4.93       7.11  2016-02-14 19:00:00  Thor Akureyri          Leiknir F.           5           0
4      381088  Iceland  League Cup       1.44       4.53       6.02  2016-02-14 17:00:00        Akranes           Grindavik           5           0

解决方案

问题核心是部分分数字符串已被Pandas转换为浮点数值,导致自定义函数的分数判断分支未触发,直接返回原始数值(未加1)。修改转换函数,确保无论输入是分数字符串还是浮点/整数,都先获取原始赔率值,再统一加1:

def convert(s):
    s_str = str(s)
    if '/' in s_str:
        # 处理分数字符串
        num, den = s_str.split('/')
        raw_odds = int(num) / int(den)
    else:
        # 处理已转换的数值类型
        raw_odds = float(s)
    # 统一加1得到预期结果
    return raw_odds + 1

odds_cols = ['home_odds', 'draw_odds', 'away_odds']
df[odds_cols] = df[odds_cols].applymap(convert)

修改后运行代码,即可得到符合预期的转换结果。

关于Pandas识别分数字符串为float64的疑问

通常情况下,Pandas不会自动将167/50这类分数字符串转换为浮点数值,出现这种情况的常见原因有:

  • 数据源特性:如果数据来自Excel等工具,单元格可能是公式(如=167/50),读取时会直接返回计算后的数值,而非原始字符串。
  • 读取参数设置:读取数据时使用了支持解析分数的参数或转换器(如pd.read_csv的converters参数,或第三方库辅助解析)。
  • 显示格式问题:DataFrame的显示格式被设置为以分数形式展示浮点数值,实际存储的仍是浮点类型(可通过df['home_odds'].dtype验证真实类型)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:08:00