pandas使用lambda切分列时btts_y转float报ValueError求助
错误根因
- 原代码对两列硬编码了相同的拆分分隔符:
btts_x的两个值用双换行\n\n分隔,btts_y的两个值用单换行\n分隔。硬按\n\n拆分btts_y时,每个单元格根本不会被切开,最终整个带单换行的字符串被传入astype(float)流程,才抛出无法转float的ValueError。 - 爬取的网页内容里换行符格式不统一是常见问题,不需要对两列单独适配拆分逻辑,统一匹配所有连续换行即可。
可落地的实现方案
方案1:嵌入re.sub的lambda实现(匹配你最初的实现思路)
统一将所有连续换行符替换为固定分隔标记后再拆分,不用区分两列的换行差异:
import re import pandas as pd def results(frame): # 通用拆分逻辑:匹配1个及以上任意数量的换行符,替换后拆分 split_by_newline = lambda raw_str: re.sub(r'\n+', '#', raw_str).split('#') for col_name, col_prefix in [('btts_x', 'btts_x'), ('btts_y', 'btts_y')]: split_df = frame[col_name].apply(split_by_newline).apply(pd.Series) split_df.columns = [f'{col_prefix}_1', f'{col_prefix}_2'] frame = pd.concat([frame, split_df.astype(float)], axis=1) return frame
正则规则说明:r'\n+'可以匹配单个\n、连续两个\n甚至更多连续换行的场景,完全兼容你当前两列的格式差异,不会出现拆分失效的问题。
方案2:更简洁的pandas原生实现(无需手动写apply流程)
利用pandas字符串方法自带的正则拆分能力,代码更短、运行效率更高:
import pandas as pd def results(frame): for col_name, col_prefix in [('btts_x', 'btts_x'), ('btts_y', 'btts_y')]: # expand=True会直接把拆分后的内容生成独立列 split_df = frame[col_name].str.split(r'\n+', expand=True).astype(float) split_df.columns = [f'{col_prefix}_1', f'{col_prefix}_2'] frame = pd.concat([frame, split_df], axis=1) return frame
适配示例数据的运行效果
处理完成后会完整生成所有拆分列,完全匹配你需要的数值计算前置要求:
| Teams_x | btts_x | Teams_y | btts_y | btts_x_1 | btts_x_2 | btts_y_1 | btts_y_2 |
|---|---|---|---|---|---|---|---|
| Leicester City vs Manchester United | 1.55\n\n2.40 | Leicester City vs Manchester United | 1.50\n2.40 | 1.55 | 2.40 | 1.50 | 2.40 |
| Aston Villa vs Crystal Palace | 1.68\n\n2.14 | Aston Villa vs Crystal Palace | 1.60\n2.20 | 1.68 | 2.14 | 1.60 | 2.20 |
| Fulham vs Southampton | 1.72\n\n2.08 | Fulham FC vs Southampton FC | 1.70\n2.00 | 1.72 | 2.08 | 1.70 | 2.00 |
| Arsenal vs Chelsea | 1.79\n\n1.98 | Arsenal FC vs Chelsea FC | 1.70\n2.00 | 1.79 | 1.98 | 1.70 | 2.00 |
内容的提问来源于stack exchange,提问作者stephen.m
相关产品推荐
相关产品推荐

