2016-07-04 16 views
6

मैं एक पांडा dataframe जिसकी प्रविष्टियों को सभी स्ट्रिंग्स हैं:पांडा से निश्चित मूल्यों से युक्त पंक्तियां चुनें dataframe

A  B  C 
1 apple banana pear 
2 pear pear apple 
3 banana pear pear 
4 apple apple pear 

आदि मैं सभी पंक्तियों कि एक निश्चित स्ट्रिंग, कहते हैं, 'केला' शामिल चयन करना चाहते हैं। मुझे नहीं पता कि यह प्रत्येक कॉलम में कौन सा कॉलम दिखाई देगा। बेशक, मैं सभी पंक्तियों पर लूप और पुनरावृत्ति के लिए लिख सकता हूं। लेकिन क्या ऐसा करने का एक आसान या तेज़ तरीका है?

+3

आप केवल 'डीएफ [df.values ​​==' केला '] ' –

उत्तर

2
NumPy साथ

, यह के रूप में कई तार के लिए खोज करने के रूप में आप, इच्छा तो जैसे vectorized किया जा सकता है

In [393]: df 
Out[393]: 
     A  B  C 
0 apple banana pear 
1 pear pear apple 
2 banana pear pear 
3 apple apple pear 

In [394]: select_rows(df,['apple','banana']) 
Out[394]: 
     A  B  C 
0 apple banana pear 

In [395]: select_rows(df,['apple','pear']) 
Out[395]: 
     A  B  C 
0 apple banana pear 
1 pear pear apple 
3 apple apple pear 

In [396]: select_rows(df,['apple','banana','pear']) 
Out[396]: 
     A  B  C 
0 apple banana pear 
+0

वास्तव में यह उपयोग करना आसान है जब एकाधिक स्ट्रिंग्स – mcglashan

3

आप अपने स्ट्रिंग के खिलाफ df पूरे तुलना करने से एक बूलियन मुखौटा बना सकते हैं और dropna पंक्तियों जहाँ आपके स्ट्रिंग सभी कॉलम में प्रकट नहीं होता ड्रॉप करने परम how='all' गुजर कॉल कर सकते हैं:

से अधिक मान के लिए परीक्षण करने के लिए आप एक से अधिक मास्क का उपयोग कर सकते हैं:

:

In [90]: 
banana = df[(df=='banana')].dropna(how='all') 
banana 

Out[90]: 
     A  B C 
1  NaN banana NaN 
3 banana  NaN NaN 

In [91]:  
apple = df[(df=='apple')].dropna(how='all') 
apple 

Out[91]: 
     A  B  C 
1 apple NaN NaN 
2 NaN NaN apple 
4 apple apple NaN 

तुम बस आम सूचकांक मूल्यों सूचकांक करने के लिए उपयोग कर सकते हैं index.intersection

def select_rows(df,search_strings): 
    unq,IDs = np.unique(df,return_inverse=True) 
    unqIDs = np.searchsorted(unq,search_strings) 
    return df[((IDs.reshape(df.shape) == unqIDs[:,None,None]).any(-1)).all(0)] 

नमूना रन - -

In [93]: 
df.loc[apple.index.intersection(banana.index)] 

Out[93]: 
     A  B  C 
1 apple banana pear 
+0

धन्यवाद भी कर सकते हैं। यह निश्चित रूप से काम करता है अगर मैं एक स्ट्रिंग की तलाश में हूं। क्या होगा यदि मैं उन पंक्तियों का चयन करना चाहता हूं जिनमें 'केला' और 'सेब' दोनों शामिल हों? – mcglashan

+0

मुझे पांडा नहीं पता, लेकिन शायद ऐसा कुछ: 'डीएफ [डीएफ ==' केला ',' सेब ']। ड्रॉपना (कैसे =' सब ') '? – Deadpool

+0

@ एंड्रोमेडे 9 3 9 जो मुझे एक टाइप एरर – mcglashan

3

एक खोज मूल्य के लिए

df[df.values == "banana"] 

या

df[df.isin(['banana'])] 

अनेक खोज शब्द के लिए:

df[(df.values == "banana")|(df.values == "apple") ] 

या

df[df.isin(['banana', "apple"])] 

    #   A  B  C 
    # 1 apple banana NaN 
    # 2  NaN  NaN apple 
    # 3 banana  NaN NaN 
    # 4 apple apple NaN 

दिवाकर से: दोनों के साथ लाइनों लौटाए जाते हैं।

select_rows(df,['apple','banana']) 

#   A  B  C 
# 0 apple banana pear 
+0

खोजते समय आखिरी पंक्ति वास्तव में मुझे एक खाली डेटाफ्रेम देता है जब मैं इसे आज़माता हूं – mcglashan

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