如何通过正则匹配DataFrame列关键词,高效创建新列?
高效实现DataFrame关键词匹配生成新列的方案
先分析你之前的问题
- 第一个代码仅针对
boy处理,多关键词叠加时会因逐次赋值覆盖之前结果,且非向量化操作效率低; - 第二个代码的正则
^boy\W仅匹配以boy开头且后跟非单词字符的场景,无法匹配字符串中间的关键词,且replace是替换原字符串内容,而非生成新标签列,逻辑不符合需求。
推荐三种可行方案
方案1:np.select(高效向量化,推荐)
利用numpy的select方法批量处理多条件判断,适合大数据量场景,逻辑清晰且效率高:
import numpy as np import pandas as pd # 构造示例DataFrame data = { 'A': [ 'boy_was_born_in_2010', 'men_was_born_in_1997', 'girl_this_is_2022', 'this_is_a_lady', 'how_tall_is_this_boy', 'girl_is_studying' ] } df = pd.DataFrame(data) # 定义匹配条件与对应标签 conditions = [ df['A'].str.contains('boy|girl', regex=True), df['A'].str.contains('men', regex=True), df['A'].str.contains('lady', regex=True) ] values = ['Kid', 'Male', 'Female'] # 生成新列B df['B'] = np.select(conditions, values)
注:条件按顺序判断,优先匹配先定义的规则,若需调整优先级,修改条件列表顺序即可。
方案2:str.replace结合正则映射
通过正则匹配任意位置的关键词,一次完成标签映射:
# 定义关键词到标签的正则映射 mapping = { r'.*(boy|girl).*': 'Kid', r'.*men.*': 'Male', r'.*lady.*': 'Female' } # 生成新列B df['B'] = df['A'].replace(mapping, regex=True)
注:字典的键顺序会影响匹配优先级,需将Kid的规则放在前面,避免被其他规则覆盖。
方案3:apply(逻辑直观,适合新手理解)
通过遍历每行文本判断关键词,逻辑最直白,但大数据量下效率略低于前两种向量化方法:
def get_label(text): if 'boy' in text or 'girl' in text: return 'Kid' elif 'men' in text: return 'Male' elif 'lady' in text: return 'Female' # 可添加默认返回值,如return 'Unknown' return None df['B'] = df['A'].apply(get_label)
内容的提问来源于stack exchange,提问作者Prabhat Singh
相关产品推荐
相关产品推荐

