Pandas如何将单元格内多个变量值合并替换为单一目标值
问题根源
你之前的代码存在两个核心逻辑错误,导致无法得到预期结果:
- 正则规则
^RW仅匹配单元格开头的RW子串,replace默认做子串替换而非整值判断,自然只会替换开头的RW片段,保留其余内容 - 没有对单元格内逗号分隔的多值做拆分匹配,也没有做「命中规则则整格赋值为对应分类」的逻辑,本质是用子串替换的思路实现整格重分类,逻辑完全不匹配
可直接复用的实现方案
你可以根据自己的分类规则选任意一种方案实现:
方案1:自定义映射函数(逻辑灵活,易维护)
这个方案可以灵活调整位置匹配规则、分类优先级,适合后续需要扩展分类的场景:
- 首先明确所有原始位置到简化分类的对应关系,先定义分类判断逻辑(你可以按需补全球员位置分类,比如补充后卫、门将类的映射)
- 编写单行处理函数,自动兼容「逗号带空格」「逗号不带空格」两种多值格式,按优先级匹配分类后直接返回单值
- 用
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
相关产品推荐
相关产品推荐

