如何判断Pandas DataFrame中col1字符串是否包含col2对应值?
在Pandas中逐行判断col1是否包含col2的字符串解决方案
刚好之前解决过类似的问题,我来帮你理清楚怎么处理这个需求:你需要在Pandas DataFrame中新增一列,标记每行的col1字符串是否包含对应行col2的字符串。
先明确你的示例场景:
import pandas as pd df = pd.DataFrame({'col1': ['a', 'aa', 'b', 'bb', 'c', 'cc'], 'col2': ['a', 'b', 'c', 'd', 'e', 'c']}) # 期望得到的标记列:pd.Series([True, False, False, False, False, True])
为什么直接用df.col1.str.contains(df.col2)会报错?
当你尝试执行df.col1.str.contains(df.col2)时触发TypeError,核心原因是:str.contains()方法的pat参数默认要求传入单个字符串(或者正则表达式模式),它会把整个col2的Series当成一个整体的匹配模式,而不是逐行对应匹配每一对col1和col2的值,这就导致了类型不匹配的错误。
正确的解决方案
这里给你三种可行的实现方式,按需选择:
方法1:使用apply()逐行处理(直观易懂)
这是最直观的写法,通过apply()遍历每一行,对每行的col1和col2做包含判断:
df['contains_flag'] = df.apply(lambda row: row['col2'] in row['col1'], axis=1)
方法2:使用列表推导式(性能更优)
如果你的DataFrame数据量较大,列表推导式的性能会比apply()更好,因为它避开了Pandas行级循环的额外开销:
df['contains_flag'] = [col2 in col1 for col1, col2 in zip(df['col1'], df['col2'])]
方法3:使用numpy的vectorize(向量化实现)
你也可以用numpy的向量化函数来实现逐行匹配,适合习惯向量化编程的场景:
import numpy as np contains_check = np.vectorize(lambda x, y: y in x) df['contains_flag'] = contains_check(df['col1'], df['col2'])
执行任意一种方法后,df['contains_flag']都会得到你期望的结果:
0 True 1 False 2 False 3 False 4 False 5 True Name: contains_flag, dtype: bool
内容的提问来源于stack exchange,提问作者Max Power
相关产品推荐
相关产品推荐

