如何在Pandas DataFrame中分离列中两队名并提取非主队名称
解决Pandas DataFrame分离客队名称的方法
核心思路
从text_only_away列中剔除text_only列的主队名称,保留剩余的客队名称,重点处理字符串匹配的边界问题,避免部分匹配导致的错误结果。
具体实现方案
方法1:正则边界匹配替换
利用正则的\b(单词边界)确保只匹配完整的主队名称,避免类似"St."这类后缀被误匹配:
import pandas as pd # 生成客队名称列 df_games_2023['away_team'] = df_games_2023.apply( lambda row: row['text_only_away'].replace(rf"\b{row['text_only']}\b", "").strip(), axis=1 )
- 说明:
strip()用于清除替换后残留的首尾空格,保证客队名称格式整洁。
方法2:拆分字符串筛选
如果text_only_away的两个球队名称用固定分隔符(比如" vs ")拼接,可直接拆分后筛选:
# 替换分隔符为实际使用的字符,比如"@"或" vs " df_games_2023['away_team'] = df_games_2023.apply( lambda row: [team for team in row['text_only_away'].split(" vs ") if team != row['text_only']][0], axis=1 )
- 说明:拆分后生成球队列表,直接筛选出不等于主队名称的项,即为客队名称。
方法3:特殊字符兼容处理
如果球队名称包含.、'等特殊正则字符,先转义再匹配,同时清理残留分隔符:
import re def extract_away_team(row): # 转义主队名称中的特殊正则字符 escaped_home = re.escape(row['text_only']) # 替换主队名称并清理空格 away = re.sub(rf"\b{escaped_home}\b", "", row['text_only_away']).strip() # 移除可能残留的分隔符(如"vs ") away = re.sub(r"^\s*(vs|VS)\s*", "", away) return away df_games_2023['away_team'] = df_games_2023.apply(extract_away_team, axis=1)
结果验证
运行后可通过以下代码快速检查结果是否符合预期:
print(df_games_2023[['text_only', 'text_only_away', 'away_team']].head())
内容的提问来源于stack exchange,提问作者Pmannn
相关产品推荐
相关产品推荐

