Python和Pandas:如何查询列表类型列是否包含某些内容?

cqc*_*991 21 python pandas

我有一个数据框,其中包含有关电影的信息.它有一个名为的列genre,其中包含它所属的类型列表.例如:

df['genre']

## returns 

0       ['comedy', 'sci-fi']
1       ['action', 'romance', 'comedy']
2       ['documentary']
3       ['crime','horror']
...
Run Code Online (Sandbox Code Playgroud)

我想知道如何查询数据帧,所以它返回属于cerain类型的电影?

例如,某些东西可能会df['genre'].contains('comedy')返回0或1.

我知道列表,我可以这样做:

'comedy' in  ['comedy', 'sci-fi']
Run Code Online (Sandbox Code Playgroud)

但是,在大熊猫中,我没有找到类似的东西,我唯一知道的是df['genre'].str.contains(),但它对列表类型不起作用.

jez*_*ael 25

您可以使用apply创建mask然后boolean indexing:

mask = df.genre.apply(lambda x: 'comedy' in x)
df1 = df[mask]
print (df1)
                       genre
0           [comedy, sci-fi]
1  [action, romance, comedy]
Run Code Online (Sandbox Code Playgroud)

  • 您可以将其修改为:('value1' in x) 和 ('value2' in x) (2认同)

piR*_*red 13

使用集

df.genre.map(set(['comedy']).issubset)

0     True
1     True
2    False
3    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)
df.genre[df.genre.map(set(['comedy']).issubset)]

0             [comedy, sci-fi]
1    [action, romance, comedy]
dtype: object
Run Code Online (Sandbox Code Playgroud)

以一种我更喜欢的方式呈现

comedy = set(['comedy'])
iscomedy = comedy.issubset
df[df.genre.map(iscomedy)]
Run Code Online (Sandbox Code Playgroud)

更高效

comedy = set(['comedy'])
iscomedy = comedy.issubset
df[[iscomedy(l) for l in df.genre.values.tolist()]]
Run Code Online (Sandbox Code Playgroud)

使用str两遍
慢!并不完全准确!

df[df.genre.str.join(' ').str.contains('comedy')]
Run Code Online (Sandbox Code Playgroud)

  • _更高效_您对此有任何基准/测量吗?我很好奇,我不希望 `.map()` 这么短。 (2认同)

HYR*_*YRY 7

根据源码,就可以使用了.str.contains(..., regex=False)