python - 检查 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 函数,或者下一个最优化的自定义解决方案。
解决方案
这也应该有效:
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)
推荐阅读
- python - 创建模型后清除python循环中的内存
- akka - Akka Streams 高 CPU 使用率和创建的线程过多
- solr - 如何在 charfilter 函数中添加撇号 (')?
- python - 基于均值标准化数据
- php - MYSQL 对列和排名进行分组
- sas - 使用宏而不是 25 个 proc sql 步骤?
- python - 如何根据另一个数据框行值通过连接填充一个数据框行单元格?
- android - 房间:为参数传递值
- wordpress - 带有 3 个链接数据点的 Wordpress 自定义字段
- laravel - laravel 什么时候执行 yearly() 函数