2015-02-23 6 views
31

मेरे पास अजगर में एक बहुत बड़ा डेटा फ्रेम है और मैं उन सभी पंक्तियों को छोड़ना चाहता हूं जिनमें एक विशेष कॉलम के अंदर एक विशेष स्ट्रिंग है।पांडा डेटा फ्रेम से पंक्तियों को कैसे ड्रॉप करें जिसमें किसी विशेष कॉलम में एक विशेष स्ट्रिंग है?

उदाहरण के लिए, मैं उन सभी पंक्तियों को छोड़ना चाहता हूं जिनमें स्ट्रिंग "XYZ" डेटा फ्रेम के कॉलम सी में एक सबस्ट्रिंग के रूप में है।

क्या इसे .drop() विधि का उपयोग करके एक कुशल तरीके से कार्यान्वित किया जा सकता है?

उत्तर

50

पांडा स्ट्रिंग आपरेशन vectorized गया है, इसलिए तुम सिर्फ पंक्तियों को स्ट्रिंग शामिल फ़िल्टर कर सकते हैं यदि आप नहीं चाहते:

In [91]: df = pd.DataFrame(dict(A=[5,3,5,6], C=["foo","bar","fooXYZbar", "bat"])) 

In [92]: df 
Out[92]: 
    A   C 
0 5  foo 
1 3  bar 
2 5 fooXYZbar 
3 6  bat 

In [93]: df[df.C.str.contains("XYZ") == False] 
Out[93]: 
    A C 
0 5 foo 
1 3 bar 
3 6 bat 
+18

हालांकि क्या आप ने लिखा सही और अधिक पठनीय है, एक छोटा तरीका होगा: 'df [~ df.C.str.contains (" XYZ ") ] ' – EdChum

15

यदि आपका स्ट्रिंग बाधा नहीं सिर्फ एक स्ट्रिंग आप उन इसी पंक्तियों छोड़ सकते हैं साथ:

df = df[~df['your column'].isin(['list of strings'])] 

ऊपर अपनी सूची

+0

आप इसके विपरीत कैसे करेंगे? मैं यह जांचना चाहता हूं कि कॉलम मान में स्ट्रिंग्स में से कोई भी है या नहीं। छद्म: 'list_of_strings में स्ट्रिंग के लिए, जांचें कि कॉलम में यह – radtek

+1

है, बस" ~ " डीएफ = डीएफ [डीएफ ['आपका कॉलम'] हटाएं। isin (['स्ट्रिंग्स की सूची']] – ksooklall

+0

पहले से ही यह जा रहा है , लेकिन धन्यवाद – radtek

5

के तत्वों यह केवल कार्य करेगा जब आप सही तार की तुलना करना चाहते हैं सभी पंक्तियों छोड़ देंगे। यदि आप यह जांचना चाहते हैं कि कॉलम स्ट्रिंग में सूची में से कोई भी स्ट्रिंग है या नहीं, तो यह काम नहीं करेगा। एक सूची के साथ तुलना करने के लिए सही तरीके से होगा:

searchfor = ['john', 'doe'] 
    df = df[~df.col.str.contains('|'.join(searchfor))] 
संबंधित मुद्दे