如何拆分DataFrame中姓名词数可变的球员信息列为两列
拆分DataFrame中球员姓名与位置列的方法
问题背景
现有一个包含球员信息的DataFrame,其中Player列的字符串由1-3个词的球员姓名和位置组合而成,需要将该列拆分为Player(姓名)和Position(位置)两列。
输入示例
- 单名格式:
Jorginho Defensive Midfield - 双名格式:
Heung-min Son Left Winger - 三名格式:
Bilal El Khannouss Attacking Midfield
期望输出
Player Position Jorginho Defensive Midfield Heung-min Son Left Winger Bilal El Khannouss Attacking Midfield
原始代码与已知条件
已尝试用split()按空格拆分,但因姓名词数可变无法实现,已知所有球员位置列表,原始代码如下:
import pandas as pd df = pd.DataFrame({'Player': ['Richarlison Centre-Forward', 'Heung-min Son Left Winger', 'Harry Wilson Right Winger', 'Bilal El Khannouss Attacking Midfield', 'Eduardo Camavinga Central Midfield', 'Jorginho Defensive Midfield', 'Lewis Patterson Centre-Back', 'Layvin Kurzawa Left-Back', 'Kyle Walker Right-Back', 'Jordan Pickford Goalkeeper']}) positions = ['Centre-Forward', 'Left Winger', 'Right Winger', 'Attacking Midfield', 'Central Midfield', 'Defensive Midfield', 'Centre-Back', 'Left-Back', 'Right-Back', 'Goalkeeper']
可行解决方案
方法一:正则表达式提取
利用已知的位置列表构建正则匹配模式,直接从字符串末尾提取位置,剩余部分作为姓名:
# 构建正则匹配模式,匹配任意一个位置 position_pattern = '|'.join(positions) # 提取姓名和位置 df[['Player', 'Position']] = df['Player'].str.extract(f'(.*)\s({position_pattern})$') # 清理姓名部分的多余空格 df['Player'] = df['Player'].str.strip()
方法二:反向匹配提取位置
先遍历位置列表找到每个字符串对应的位置,再从原字符串中移除位置得到姓名:
# 定义函数提取位置 def get_position(s): for pos in positions: if s.endswith(pos): return pos return None # 添加Position列 df['Position'] = df['Player'].apply(get_position) # 提取姓名:移除位置及前面的空格 df['Player'] = df.apply(lambda x: x['Player'].rstrip(x['Position']).strip(), axis=1)
验证结果
执行上述任意一种方法后,打印df即可得到期望的拆分结果:
print(df)
输出:
Player Position 0 Richarlison Centre-Forward 1 Heung-min Son Left Winger 2 Harry Wilson Right Winger 3 Bilal El Khannouss Attacking Midfield 4 Eduardo Camavinga Central Midfield 5 Jorginho Defensive Midfield 6 Lewis Patterson Centre-Back 7 Layvin Kurzawa Left-Back 8 Kyle Walker Right-Back 9 Jordan Pickford Goalkeeper
内容的提问来源于stack exchange,提问作者codemachine
相关产品推荐
相关产品推荐

