首页 > 解决方案 > 检查 pandas Dataframe 字符串列是否包含数组中给定的所有元素

问题描述

我有一个数据框,如下所示:

>>> import pandas as pd
>>> df = pd.DataFrame(data = [['app;',1,2,3],['app; web;',4,5,6],['web;',7,8,9],['',1,4,5]],columns = ['a','b','c','d'])
>>> df
           a  b  c  d
0       app;  1  2  3
1  app; web;  4  5  6
2       web;  7  8  9
3             1  4  5

我有一个如下所示的输入数组:["app","web"] 对于这些值中的每一个,我想检查数据框的特定列并返回一个决定,如下所示:

>>> df.a.str.contains("app")
0     True
1     True
2    False
3    False

由于str.contains只允许我寻找一个单独的值,我想知道是否有其他直接的方法来确定相同的东西,例如:

 df.a.str.contains(["app","web"]) # Returns TypeError: unhashable type: 'list'

我的最终目标不是进行绝对匹配 ( df.a.isin(["app", "web"]),而是一个“包含”逻辑,即使数据框的该单元格中存在这些字符,它也会返回 true。

注意:我当然可以使用 apply 方法为相同的逻辑创建自己的函数,例如:

elementsToLookFor = ["app","web"]
df[header] = df.apply(lambda element: all([a in element for a in elementsToLookFor]))

但我对此的最佳算法更感兴趣,因此更喜欢在 pandas 中使用本机 pandas 函数,或者下一个最优化的自定义解决方案。

标签: pythonpandasdataframe

解决方案


这也应该有效:

l = ["app","web"]
df['a'].str.findall('|'.join(l)).map(lambda x: len(set(x)) == len(l))

这也应该起作用:

pd.concat([df['a'].str.contains(i) for i in l],axis=1).all(axis = 1)

推荐阅读