2017-01-07 3 views
7

मेरे पास डेटाफ्रेम है, जिसमें फिल्मों के बारे में जानकारी है। इसमें genre नामक एक कॉलम है, जिसमें शैलियों की एक सूची शामिल है। उदाहरणपायथन और पांडस: यदि सूची-प्रकार कॉलम में कुछ है तो क्वेरी कैसे करें?

df['genre'] 

## returns 

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

के लिए मुझे पता है कि कैसे मैं df क्वेरी कर सकते हैं, तो यह फिल्म एक cerain शैली के अंतर्गत आता है रिटर्न?

उदाहरण के लिए, कुछ 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 

एक तरीके से प्रस्तुत किया मैं दो गुजरता
धीमी में

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()]] 

का उपयोग कर str बेहतर पसंद है! और बिल्कुल सही नहीं है!

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

source code के अनुसार, आप .str.contains(..., regex=False) उपयोग कर सकते हैं।

+0

यह मेरा प्रारंभिक विचार था जो दुर्भाग्य से काम नहीं करता क्योंकि यह आंशिक स्ट्रिंग मैचों के लिए भी 'ट्रू' देता है। –

संबंधित मुद्दे