如何使用Python和Pandas解析NFL文本数据并拆分字段到不同数据单元格
NFL Fantasy预测数据结构化Python解决方案
核心思路
- 过滤原始文本中的空行、球队比分行,仅保留球员统计行
- 用正则拆分球员姓名与统计字符串
- 针对不同格式的统计串,编写对应正则规则捕获接球数、码数、达阵数三个目标字段,缺失字段统一填充空值
- 将结构化后的数据转换为pandas DataFrame
完整实现代码
import re import pandas as pd # 这里替换为你自己的原始数据文本 raw_text = """Bears 24-17 Jaguars M.Trubisky- 234/2TDs D.Montgomery- 113 scrim yards/1 rush TD/4 rec A.Robinson- 9/114/1 C.Kmet- 3/35/0 G.Minshew- 183/1TD/2int J.Robinson- 77 scrim yards/1 rush TD/4 rec DJ.Chark- 3/36""" # 预处理:拆分行为列表,过滤无效行 lines = [line.strip() for line in raw_text.split('\n') if line.strip()] # 过滤球队比分行 player_lines = [line for line in lines if not re.search(r'\d+-\d+', line)] def parse_player_stat(line): # 拆分球员姓名和统计字符串 name_pat = re.match(r'^(.+?)\s*-\s*(.+)$', line) if not name_pat: return None player_name = name_pat.group(1) stat_str = name_pat.group(2) # 提取接球数 rec_pat = re.search(r'(\d+)\s*rec', stat_str) if rec_pat: receptions = int(rec_pat.group(1)) else: # 适配外接手/近端锋常用的 接球数/码数/达阵 格式 stat_segs = stat_str.split('/') if len(stat_segs)>=3 and all(s.strip().isdigit() for s in stat_segs[:3]): receptions = int(stat_segs[0].strip()) else: receptions = None # 提取码数 yard_pat = re.search(r'(\d+)\s*scrim yards', stat_str) if yard_pat: yards = int(yard_pat.group(1)) else: stat_segs = stat_str.split('/') if len(stat_segs)>=2 and stat_segs[1].strip().isdigit(): yards = int(stat_segs[1].strip()) elif len(stat_segs)>=1 and stat_segs[0].strip().isdigit(): yards = int(stat_segs[0].strip()) else: yards = None # 提取达阵数 td_pat = re.search(r'(\d+)\s*(TD|TDs)', stat_str) if td_pat: tds = int(td_pat.group(1)) else: stat_segs = stat_str.split('/') if len(stat_segs)>=3 and stat_segs[2].strip().isdigit(): tds = int(stat_segs[2].strip()) else: tds = None return { "球员姓名": player_name, "接球数": receptions, "码数": yards, "达阵数": tds } # 解析所有球员数据生成DataFrame parsed_result = [parse_player_stat(line) for line in player_lines if parse_player_stat(line)] df = pd.DataFrame(parsed_result) # 输出查看结果 print(df)
扩展说明
如果你的原始数据中存在其他格式的统计项,只需在解析函数中补充对应正则匹配规则即可适配,冲球数、抄截数等额外字段也可以用相同逻辑提取。
内容的提问来源于stack exchange,提问作者Nicholas O'Callaghan
相关产品推荐
相关产品推荐

