2017-01-07 8 views
7

私は映画に関する情報を含むデータフレームを持っています。 genreという列があり、属するジャンルのリストが含まれています。たとえば、Python&Pandas:リスト型の列に何かが含まれているかどうかを調べる方法は?

df['genre'] 

## returns 

0  ['comedy', 'sci-fi'] 
1  ['action', 'romance', 'comedy'] 
2  ['documentary'] 
3  ['crime','horror'] 
... 

私はdfをどのように照会すればよいのか知りたいので、映画はセランのジャンルに属していますか?例えば

、何かが私のリストについては知っているdf['genre'].contains('comedy') 0を返し、1

が好きなこと、私は

'comedy' in ['comedy', 'sci-fi'] 

のようなものを行うことができますが、パンダで、私は似たような見つけることができませんでした私が知っている唯一のものはdf['genre'].str.contains()ですが、リストタイプでは機能しませんでした。

答えて

6

あなたは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] 
5

使用してセット

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

0  True 
1  True 
2 False 
3 False 
dtype: bool 

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

0    [comedy, sci-fi] 
1 [action, romance, comedy] 
dtype: object 

は、私は二つのパス
スローでstrを使用して

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

より効率的な

comedy = set(['comedy']) 
iscomedy = comedy.issubset 
df[[iscomedy(l) for l in df.genre.values.tolist()]] 

の方が好きな方法で提示します!完全に正確ではありません!

df[df.genre.str.join(' ').str.contains('comedy')] 
0

source codeによると、あなたは.str.contains(..., regex=False)を使用することができます。

+0

これは私の最初の考えでしたが、残念ながらそれは部分的な文字列の一致に対しても 'True'を返すので機能しません。 –