如何将R中字符串匹配条件赋值代码转换为Pandas等效Python语法
R代码对应Pandas实现方案
方案1:使用.loc布尔索引赋值(和原R逻辑完全对齐)
第一步:定义所有匹配规则的布尔掩码
和你已经写的逻辑一致,不需要正则的情况下可以关闭正则匹配提升性能:
network_tickets = df['ComplaintDescription'].str.contains('network', case=False, regex=False) internet_tickets = df['ComplaintDescription'].str.contains('internet', case=False, regex=False) billing_tickets = df['ComplaintDescription'].str.contains('bill', case=False, regex=False) email_tickets = df['ComplaintDescription'].str.contains('email', case=False, regex=False) charges_ticket = df['ComplaintDescription'].str.contains('charge', case=False, regex=False)
第二步:按规则赋值
先初始化目标列为默认值Others,再根据布尔掩码匹配赋值即可:
# 初始化默认分类 df['ComplaintType'] = 'Others' # 按规则匹配覆盖,后赋值的规则优先级更高,和原R逻辑一致 df.loc[internet_tickets, 'ComplaintType'] = 'Internet' df.loc[network_tickets, 'ComplaintType'] = 'Network' df.loc[billing_tickets, 'ComplaintType'] = 'Billing' df.loc[email_tickets, 'ComplaintType'] = 'Email' df.loc[charges_ticket, 'ComplaintType'] = 'Charges'
方案2:使用numpy.select更简洁实现
如果不想写多行.loc赋值,可以用numpy的select方法批量处理条件和对应值:
import numpy as np # 按顺序定义条件和对应返回值 conditions = [ internet_tickets, network_tickets, billing_tickets, email_tickets, charges_ticket ] values = ['Internet', 'Network', 'Billing', 'Email', 'Charges'] # 不满足所有条件的行自动赋值为default参数的'Others' df['ComplaintType'] = np.select(conditions, values, default='Others')
之前代码报错原因
apply()是用来对DataFrame/Series的元素批量执行自定义函数的方法,你的使用场景不需要调用apply,直接使用布尔索引定位行即可完成赋值,逻辑和R的向量下标赋值完全对应。
内容的提问来源于stack exchange,提问作者ManiK
相关产品推荐
相关产品推荐

