有没有更好的方法使用大熊猫的字符串方法来搜索多个没有正则表达式的字符串

时间:2019-04-24 09:54:18

标签: python-3.x pandas

想知道是否有更好的解决方案可以同时搜索满足多个表达式的字符串而无需在熊猫中使用正则表达式。已经看过其他发布的答案,大多数都没有指出我的担忧。

我有一个data_frame,其中包含电影的演员表信息,如下所示,

titles actors_list
玩具总动员3》“ [[汤姆·汉克斯,汤姆·艾伦,琼·库萨克]]
低俗小说“ [u'John Travolta',u'Uma Thurman',u'Samuel L ....”

现在,我尝试选择某些由任何两个给定演员共同出演的电影。例如,我需要找出汤姆·汉克斯和蒂姆·艾伦合作了哪些电影。

pat = r'Tom Hanks.*?Tim Allen' 
p = re.compile(pat, flags=re.IGNORECASE)  
d_f[[bool(p.search(x)) for x in d_f['actors_list']]]

我通过使用正则表达式解决了这个问题。它返回两个演员都出现在该电影中的条目。

仍然,我想知道是否存在其他实现此目标的优雅方法。 非常感谢!

2 个答案:

答案 0 :(得分:0)

您可以使用pandas.Series.str.contains

>>> d = pd.DataFrame([{'title':'Toy Story 3 ','actors_list':"[u'Tom Hanks', u'Tim Allen', u'Joan Cusack']"}
                  ,{'title':'Pulp Fiction','actors_list':"[u'John Travolta', u'Uma Thurman', u'Samuel L"}
                  ,{'title':'dummy','actors_list':"[u'Tim Allen', u'Uma Thurman', u'Samuel L"}
                 ])

>>> d[(d.actors_list.str.contains('Tom Hanks'))&(d.actors_list.str.contains('Tim Allen'))]

pandas.str.contains

答案 1 :(得分:0)

根据评论中的建议,我将“ actors_list”列转换为一个集合,然后使用isubset()解决此问题。

import ast
name_set = {'Tom Hanks', 'Tim Allen'}
df[[name_set.issubset(set(ast.literal_eval(x))) for x in df['actors_list']]]