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

如何拆分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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:15:46