Pandas DataFrame字符串字段按自定义规则转数值实现方案

实现思路
基于pandas做逐行字符串处理即可,三个字段的处理逻辑完全匹配需求:
player_positions:字段内多位置以逗号分隔,拆分字符串后对位置值去重,统计元素个数即可得到可胜任位置数,空值统一填充为0work_rate:提前定义等级和数值的映射关系,拆分字段内的两个工作率值,分别匹配映射值后求和即可,兼容斜杠、逗号两种常见分隔符格式player_traits:两种编码方案按需选择:如果后续要做特征加权、正负影响力打分,选-1/1编码;如果是做常规机器学习建模,0/1哑变量编码更适配绝大多数模型的输入要求
代码参考
前置依赖:确保已经安装pandas、numpy,数据集已读取为DataFrame对象df
import pandas as pd import numpy as np # 工作率映射字典 work_rate_map = {"Low": 1, "Medium": 2, "High": 3} # 1. 转换player_positions为可胜任位置计数 df["position_count"] = df["player_positions"].apply( lambda x: len(set([pos.strip() for pos in str(x).split(",") if pos.strip()])) if pd.notna(x) else 0 ) # 2. 转换work_rate为映射求和值 def sum_work_rate(val): if pd.isna(val): return np.nan # 统一分隔符为逗号,拆分两个工作率值 rate_list = [r.strip() for r in str(val).replace("/", ",").split(",") if r.strip()] return sum(work_rate_map.get(r, 0) for r in rate_list) df["work_rate_total"] = df["work_rate"].apply(sum_work_rate) # 3. 转换player_traits为二值标识,二选一即可 # 方案A:-1/1编码,适合打分类场景 df["injury_prone"] = df["player_traits"].apply( lambda x: -1 if pd.notna(x) and "Injury Prone" in str(x) else 1 ) # 方案B:0/1编码,适合机器学习建模场景 # df["injury_prone"] = df["player_traits"].apply( # lambda x: 1 if pd.notna(x) and "Injury Prone" in str(x) else 0 # )
处理完成后可抽取T. Barkhuizen所在行校验结果:该条数据position_count应为3,work_rate_total应为5,injury_prone取值和该球员是否带易受伤特质匹配即说明逻辑正确。
内容的提问来源于stack exchange,提问作者Tom Bomer
相关产品推荐
相关产品推荐

