如何在Pandas的b列所有行中查找a列每个值是否存在?
Pandas判断DataFrame中A列字符串是否存在于B列任意行中
我需要判断Pandas DataFrame的a列中每个字符串,是否在b列的任意一行里出现(不区分大小写)。
示例数据及期望结果
import pandas as pd data = {"a":["hi","hello","yes","xyz"], "b":["asdfHI", "qwertHello","nononoXYZ", "OKOK"]} df = pd.DataFrame(data) # 原始数据: # a b # 0 hi asdfHI # 1 hello qwertHello # 2 yes nononoXYZ # 3 xyz OKOK # 期望生成`found`列:hi、hello和xyz存在于b列中,yes不存在 # a b found # 0 hi asdfHI True # 1 hello qwertHello True # 2 yes nononoXYZ False # 3 xyz OKOK True
我尝试过的错误方法
# 仅逐行匹配,xyz所在行的b列是OKOK,所以匹配失败 df.apply(lambda x: x.a.lower() in x.b.lower(), axis=1) # 输出结果: # 0 True # 1 True # 2 False # 3 False
# 错误判断逻辑:检查字符串是否在Series对象本身,而非Series的元素内容中 [aval.lower() in df.b.str.lower() for aval in df.a] # 输出结果:[False, False, False, False]
# 传入Series给contains方法,触发类型错误 df.b.str.lower().str.contains(df.a.str.lower()) # 报错:TypeError: unhashable type: 'Series'
# 同样因传入Series而非单个字符串/正则表达式,触发类型错误 df.b.str.contains(df.a.str, case=False) # 报错:TypeError: first argument must be string or compiled pattern
正确解决方案
方法1:遍历a列元素,检查整个b列(直观易懂)
# 先把b列所有内容转成小写并转为列表,方便后续查找 b_lower_list = df['b'].str.lower().tolist() # 对a列每个元素转小写,检查是否存在于任意b列的字符串中 df['found'] = df['a'].str.lower().apply(lambda x: any(x in s for s in b_lower_list))
执行后得到符合预期的结果:
a b found 0 hi asdfHI True 1 hello qwertHello True 2 yes nononoXYZ False 3 xyz OKOK True
方法2:正则表达式批量匹配(适合数据量较大场景)
# 生成包含所有a列字符串的正则模式,不区分大小写 pattern = '|'.join(df['a']) # 先找出b列中包含任意a列字符串的行 matched_b_rows = df['b'].str.contains(pattern, case=False) # 对每个a列元素,判断是否存在于匹配到的b列内容中 df['found'] = df['a'].apply(lambda x: any(df['b'][matched_b_rows].str.lower().str.contains(x.lower())))
内容的提问来源于stack exchange,提问作者Bera
相关产品推荐
相关产品推荐

