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

Python中pandas如何从字符串列生成分类列?求简洁实现方案

更优雅的实现方案

下面提供3种不同场景下的优化实现,均不需要创建中间临时列,代码更简洁易维护:


方法1:使用numpy.select(推荐,性能最优)

向量化操作,适合处理任意量级的数据,不需要遍历行,性能远高于逐行处理方案:

import numpy as np

# 条件按优先级排序,同时匹配的条件放最前
conditions = [
    df['Name'].str.contains('Joe') & df['Name'].str.contains('Bob'),
    df['Name'].str.contains('Joe'),
    df['Name'].str.contains('Bob')
]
# 对应条件的返回值
values = ['Both', 'Joe', 'Bob']
# 生成Type列,default可设置两个都不匹配时的默认值
df['Type'] = np.select(conditions, values, default='未匹配')

方法2:使用apply + 三元表达式(逻辑最直观)

适合万行以内的小数据量场景,代码短、逻辑清晰易懂:

df['Type'] = df['Name'].apply(
    lambda x: 'Both' if ('Joe' in x and 'Bob' in x)
    else 'Joe' if 'Joe' in x
    else 'Bob' if 'Bob' in x
    else '未匹配'
)

方法3:自定义函数(扩展性最强)

如果后续需要新增更多匹配人名,或者匹配逻辑有变化,封装成自定义函数便于迭代维护:

def get_person_type(name_str):
    # 后续新增匹配人名直接往该列表加即可
    target_names = ['Joe', 'Bob']
    matched_list = [name for name in target_names if name in name_str]
    if len(matched_list) == len(target_names):
        return 'Both'
    elif len(matched_list) == 1:
        return matched_list[0]
    else:
        return '未匹配'

df['Type'] = df['Name'].apply(get_person_type)

注意:如果要匹配的字符串包含*、?等正则特殊字符,在str.contains中添加regex=False参数即可实现字面量匹配。

内容的提问来源于stack exchange,提问作者Quercus Lobata

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:12:02