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

如何从西甲非结构化赛季末积分榜提取数据生成Pandas DataFrame

解决西甲非结构化积分榜提取积分的问题

针对你提取西甲积分榜积分的困境,核心问题在于非结构化数据中的冗余数字干扰了列定位,以下是针对性优化方案:

核心思路

放弃固定列名的硬匹配,转而通过正则精准提取关键信息:

  1. 从每行中分离排名、球队名称
  2. 定位每行中的积分(通常是该行最后一个有效数字,或符合积分范围的数值)

修改后的代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:00:21