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
相关产品推荐
相关产品推荐

