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

Pandas如何将单元格内多个变量值合并替换为单一目标值

问题根源

你之前的代码存在两个核心逻辑错误,导致无法得到预期结果:

  • 正则规则^RW仅匹配单元格开头的RW子串,replace默认做子串替换而非整值判断,自然只会替换开头的RW片段,保留其余内容
  • 没有对单元格内逗号分隔的多值做拆分匹配,也没有做「命中规则则整格赋值为对应分类」的逻辑,本质是用子串替换的思路实现整格重分类,逻辑完全不匹配
可直接复用的实现方案

你可以根据自己的分类规则选任意一种方案实现:

方案1:自定义映射函数(逻辑灵活,易维护)

这个方案可以灵活调整位置匹配规则、分类优先级,适合后续需要扩展分类的场景:

  1. 首先明确所有原始位置到简化分类的对应关系,先定义分类判断逻辑(你可以按需补全球员位置分类,比如补充后卫、门将类的映射)
  2. 编写单行处理函数,自动兼容「逗号带空格」「逗号不带空格」两种多值格式,按优先级匹配分类后直接返回单值
  3. 用apply将函数应用到整列完成替换
    完整代码如下:
def convert_position(pos_cell):
    # 拆分单元格内多值,自动去除每个位置前后的空格
    raw_positions = [p.strip() for p in pos_cell.split(',')]
    # 按优先级判断分类,优先级高的分类写在前面
    for pos in raw_positions:
        # 所有归属Forward的原始位置
        if pos in {'RW', 'LW', 'ST', 'CF'}:
            return 'Forward'
        # 所有归属midfielder的原始位置
        if pos in {'CM', 'CDM', 'CAM', 'LM', 'RM'}:
            return 'midfielder'
        # 未命中上述规则的位置可返回自定义默认值
    return 'Other'

# 应用到目标列完成替换
df['player_positions'] = df['player_positions'].apply(convert_position)

用你提供的示例数据测试,输出结果完全符合预期:

  • messi对应的RW, ST, CF会被替换为Forward
  • Ronaldo对应的ST,LW会被替换为Forward
  • 若某行值为CM, CDM,则会被替换为midfielder

方案2:正则整格匹配替换(代码更简短)

如果不想写自定义函数,可以调整正则规则,让正则匹配整个单元格内容——只要单元格内任意位置包含目标分类下的位置,就将整格替换为对应分类。注意高优先级的分类要先执行替换,避免被低优先级规则覆盖:

# 优先替换Forward类:匹配任意包含RW/LW/ST/CF的单元格,整格替换为Forward
df['player_positions'] = df['player_positions'].replace(
    to_replace=r'.*(RW|LW|ST|CF).*',
    value='Forward',
    regex=True
)
# 再替换midfielder类
df['player_positions'] = df['player_positions'].replace(
    to_replace=r'.*(CM|CDM|CAM|LM|RM).*',
    value='midfielder',
    regex=True
)
注意事项
  • 你需要把所有归属对应分类的原始位置都补进判断规则/正则里,否则未被收录的位置会命中默认值/保留原值
  • 如果存在同一个单元格同时包含前锋、中场位置的极端情况,靠调整判断顺序/替换顺序确定最终分类即可

内容的提问来源于stack exchange,提问作者karsvman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:18:09