从列表中找到的所有匹配子字符串组成 Polars 字符串列

Make column of all matching substrings from a list that are found within a Polars string column

提问人:Thomas 提问时间:10/30/2023 最后编辑:Thomas 更新时间:11/1/2023 访问量:63

问:

如何返回字符串中找到的所有匹配术语或子字符串的列?我怀疑有一种方法可以按照这些评论中的建议来做到这一点,但我无法完全将其拼凑在一起。pl.any_horizontal()

import re

terms = ['a', 'This', 'e']

(pl.DataFrame({'col': 'This is a sentence'})
   .with_columns(matched_terms = pl.col('col').map_elements(lambda x: list(set(re.findall('|'.join(terms), x)))))
)

该列应返回:['a', 'This', 'e']

编辑: 这里的制胜解:与这个密切相关的问题的制胜解不同:因为没有获得列表元素的子字符串(例如部分的,而不是完整的单词)。.str.extract_all('|'.join(terms)).list.unique()pl.col('col').str.split(' ').list.set_intersection(terms).set_intersection()

字符串 列表 python-polars findall set-intersection

评论

0赞 Dean MacGregor 10/30/2023
这怎么不是你自己问题的重复?stackoverflow.com/questions/77323928/......
0赞 Thomas 10/30/2023
今天是星期一,所以它很可能是重复的,但我相信区别在于:这是查看哪些术语与列表中的整个值匹配,而一旦单词被拆分,这就会考虑子字符串。这个问题是关于在新列表中查找列表元素,而如果字符串中包含任何新列表项,则这是在寻找相反的方向。这与整个术语匹配,而这个问题试图匹配子字符串。可能是类似的方法。不过,如果它是重复的,我会删除。不过,您的正则表达式答案可能会涵盖这种情况。
1赞 jqurious 10/31/2023
正如@DeanMacGregor所指出的,如果你想构建一个正则表达式,可以使用它来代替: - 也许你的示例中缺少一个步骤 - Polars 似乎没有暴露它。如果是这样,则可以在 Polars 中构建正则表达式,这可能很有用,例如.str.extract_allre.findallpl.select(pl.lit('This is a sentence').str.extract_all('This|a|e'))re.escaperegex::escape()pl.lit(terms).str.regex_escape().str.concat("|")
0赞 Thomas 11/1/2023
谢谢,它完全符合我的需求,虽然比 慢,但它确实适用于这个问题的需求,它足够不同,无法被我的另一个问题满足,并且比我拥有的旧解决方案更快(我正在使用 41k 术语 - 有时只是子字符串 - 跨越 12mil 行).str.extract_all('|'.join(terms)).list.unique().set_intersection
0赞 jqurious 11/1/2023
它可能会变得有点模糊,因为“这是一个子字符串吗?”和“这个文本是否包含这个确切的单词?”是不同的问题,但有时人们可以互换使用它们。有趣的是,您的用例会胜出。.set_intersection()

答: 暂无答案