如何用Pandas实现两列含相同指定子串时返回True的判断逻辑?
Pandas判断两列是否同时包含同一目标子串
原始数据
id k1 k2 0 1 re_setup oo_setup 1 2 oo_setup oo_setup 2 3 alerting bounce 3 4 bounce re_oversetup 4 5 re_oversetup alerting 5 6 alerting_s re_setup 6 7 re_oversetup oo_setup 7 8 alerting bounce 8 9 alerting_bounce bounce
需求说明
当k1和k2列同时包含子串setup,或者**同时包含子串bounce**时,返回True;其他情况(包括一列含setup另一列含bounce,或其中一列不含任一目标子串)返回False。
问题分析
你尝试的代码:
df['same1'] = df[['k1', 'k2']].apply(lambda x: x.str.contains('setup|bounce')).all(1)
该逻辑仅判断两列是否都包含setup或bounce中的任意一个,但未区分两列是否包含同一个子串。比如第3行k1含bounce、k2含setup,满足“都包含任一目标子串”,所以返回True,不符合需求。
正确实现方法
方法一:分条件判断匹配组
先分别标记每列是否包含setup或bounce,再筛选出两列属于同一组的情况:
# 标记各列是否包含setup has_setup_k1 = df['k1'].str.contains('setup') has_setup_k2 = df['k2'].str.contains('setup') # 标记各列是否包含bounce has_bounce_k1 = df['k1'].str.contains('bounce') has_bounce_k2 = df['k2'].str.contains('bounce') # 同时含setup 或者 同时含bounce df['same'] = (has_setup_k1 & has_setup_k2) | (has_bounce_k1 & has_bounce_k2)
执行后得到预期结果:
id k1 k2 same 0 1 re_setup oo_setup True 1 2 oo_setup oo_setup True 2 3 alerting bounce False 3 4 bounce re_oversetup False 4 5 re_oversetup alerting_bounce False 5 6 alerting_s re_setup False 6 7 re_oversetup oo_setup True 7 8 alerting bounce False 8 9 alerting_bounce bounce True
方法二:提取子串类型后比较
通过apply对每行的k1、k2提取对应的子串标签,再判断标签是否一致且不为其他类型:
def check_same(row): # 确定k1的子串类型 if 'setup' in row['k1']: type1 = 'setup' elif 'bounce' in row['k1']: type1 = 'bounce' else: type1 = 'other' # 确定k2的子串类型 if 'setup' in row['k2']: type2 = 'setup' elif 'bounce' in row['k2']: type2 = 'bounce' else: type2 = 'other' # 仅当两者同为setup或同为bounce时返回True return (type1 == type2) and (type1 != 'other') df['same'] = df.apply(check_same, axis=1)
这个方法逻辑更直观,同样能得到符合要求的结果。
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

