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

如何通过正则匹配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:36:18