如何从西甲非结构化赛季末积分榜提取数据生成Pandas DataFrame
解决西甲非结构化积分榜提取积分的问题
针对你提取西甲积分榜积分的困境,核心问题在于非结构化数据中的冗余数字干扰了列定位,以下是针对性优化方案:
核心思路
放弃固定列名的硬匹配,转而通过正则精准提取关键信息:
- 从每行中分离排名、球队名称
- 定位每行中的积分(通常是该行最后一个有效数字,或符合积分范围的数值)
修改后的代码实现
import re import pandas as pd # 替换为你的原始数据 my_unstructured_text = """ 1. Real Madrid 38 25 7 6 80 32 +48 57 Champions 2. Barcelona 38 24 6 8 75 35 +40 54 ... 20. Levante 38 7 10 21 30 65 -35 24 Relegated """ # 预处理清理干扰内容 raw_data = re.sub(r'-{40,}', '', my_unstructured_text) raw_data = re.sub(r'\[.*?\]', '', raw_data) raw_data = re.sub(r'(Champions|Relegated)', '', raw_data) rows = raw_data.strip().split('\n') # 提取每行的排名、球队、积分 processed_rows = [] for row in rows: if not row.strip(): continue # 正则匹配:排名(数字+点)、球队名称、行尾积分 match = re.match(r'(\d+)\.\s*(.*?)\s+.*?(\d+)\s*$', row.strip()) if match: pos = match.group(1) team = match.group(2).strip() pts = match.group(3) processed_rows.append([pos, team, pts]) # 生成目标DataFrame df = pd.DataFrame(processed_rows, columns=['pos', 'tm', 'pts']) print(df)
关键逻辑说明
- 正则表达式
(\d+)\.\s*(.*?)\s+.*?(\d+)\s*$:(\d+)\.:精准匹配排名(数字+点号格式)(.*?):非贪婪匹配球队名称,避免和后续数字字段混淆(\d+)\s*$:匹配行尾的积分(最后一组连续数字)
- 跳过空行保证数据有效性,直接生成仅包含目标三列的DataFrame,无需处理冗余字段
如果你的原始数据中积分并非始终在末尾,可调整正则逻辑,比如匹配符合西甲单赛季积分范围(0-114)的数值,将积分匹配部分替换为 (\b[0-9]{1,3}\b) 并结合位置判断。
内容的提问来源于stack exchange,提问作者Ozz Outao
相关产品推荐
相关产品推荐

