分数格式赔率转换错误及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
相关产品推荐
相关产品推荐

