Pandas实现Campaign列双关键词匹配新增Degree列的正确方法
正确实现方案
首先梳理原代码的核心问题:
- 逐行循环时x是Campaign列的单个字符串值,不存在str方法,
str.contains()是pandas Series的专属方法,不能直接作用在单个字符串上 - 用
'General' and 'PHD'判断双关键词的写法存在逻辑错误,受Python短路逻辑影响,实际只会判断PHD是否存在 - 赋值时误用双等号
==,属于比较运算符而非赋值操作 - 循环内直接对整列DataFrame赋值的逻辑无法实现逐行判断效果,还会大幅降低运行效率
推荐方案:向量化写法(运行效率高,适合大尺寸DataFrame)
import pandas as pd import numpy as np # 提取Campaign列的字符串序列 campaign = data['Campaign'] # 初始化新列Degree,默认填充np.nan data['Degree'] = np.nan # 逐条件匹配符合规则的行,填充对应值 # na=False的作用是将空值位置判定为不匹配,避免空值触发报错 data.loc[campaign.str.contains('General', na=False) & campaign.str.contains('PHD', na=False), 'Degree'] = 'PHD' data.loc[campaign.str.contains('General', na=False) & campaign.str.contains('BS', na=False), 'Degree'] = 'BS' data.loc[campaign.str.contains('General', na=False) & campaign.str.contains('MS', na=False), 'Degree'] = 'MS'
备选方案:逐行循环写法(适合逻辑较复杂的自定义判断场景)
import numpy as np # 初始化空列表存储每行的判断结果 degree_res = [] # 逐行遍历Campaign列的取值 for item in data['Campaign']: # 转换为字符串避免空值触发in判断报错 item_str = str(item) if ('General' in item_str) and ('PHD' in item_str): degree_res.append('PHD') elif ('General' in item_str) and ('BS' in item_str): degree_res.append('BS') elif ('General' in item_str) and ('MS' in item_str): degree_res.append('MS') else: degree_res.append(np.nan) # 将判断结果赋值给新的Degree列 data['Degree'] = degree_res
注意事项
- 若存在某行同时匹配多个条件(例如Campaign值为
"General PHD BS"),代码会按条件判断顺序优先匹配PHD,可根据实际优先级调整判断顺序 - 若需要将新列命名为原代码中的
Campaign_Degree,直接将代码中所有的Degree替换为Campaign_Degree即可
内容的提问来源于stack exchange,提问作者kalapangha
相关产品推荐
相关产品推荐

