2012-12-13 3 views
78

पर मेरे पास एक पांडा डेटाफ्रेम है और मैं इससे पंक्तियां हटाना चाहता हूं जहां किसी विशेष कॉलम में स्ट्रिंग की लंबाई 2 से अधिक है। मुझे पता है कि मैं df.dropna() का उपयोग कर सकता हूं किसी भी NaN वाली पंक्तियों से छुटकारा पाने के लिए, लेकिन मैं नहीं देख रहा हूं कि सशर्त अभिव्यक्ति के आधार पर पंक्तियों को कैसे हटाया जाए।एक पंडे से पंक्तियों को कैसे हटाएं डेटाफ्रेम एक सशर्त अभिव्यक्ति

this question के लिए इस सवाल का जवाब बहुत मैं क्या चाहते हैं उसके पास लगता है - ऐसा लगता है जैसे मैं इस तरह कुछ करने के लिए सक्षम होना चाहिए:

df[(len(df['column name']) < 2)] 

लेकिन मैं सिर्फ त्रुटि मिलती है:

KeyError: u'no item named False' 

क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं?

उत्तर

55

जब आप len(df['column name']) करते हैं तो आपको केवल एक नंबर मिल रहा है, अर्थात् डेटाफ्रेम में पंक्तियों की संख्या (यानी, कॉलम की लंबाई स्वयं)। यदि आप कॉलम में प्रत्येक तत्व के लिए len लागू करना चाहते हैं, तो df['column name'].map(len) का उपयोग करें। तो कोशिश

df[df['column name'].map(len) < 2] 
+2

मैं एक तरह से साथ एक सूची समझ का उपयोग कर आया था: 'df [[(लेन (x) <2) df [ 'स्तंभ नाम' में एक्स के लिए ]]] 'लेकिन आपका बहुत अच्छा है। आपकी सहायताके लिए धन्यवाद! – sjs

255

सीधे इस सवाल का शीर्षक (जो मुझे समझ जरूरी ओपी की समस्या नहीं है, लेकिन अन्य उपयोगकर्ताओं के इस सवाल के पार आ मदद कर सकता है) एक तरीका यह है है drop विधि का उपयोग करने का जवाब करने के लिए:

df = df.drop(some labels)

df = df.drop(df[<some boolean condition>].index)

उदाहरण

(के रूप में टिप्पणी में कहा)

df.drop(df[df.score < 50].index, inplace=True)

एकाधिक शर्तों

df = df.drop(df[df.score < 50].index)

जगह संस्करण में:

सभी पंक्तियों को निकालने के लिए जहां स्तंभ 'स्कोर' < 50 है

(देखें Boolean Indexing)

The operators are: | for or , & for and , and ~ for not . These must be grouped by using parentheses.

सभी पंक्तियों जहां स्तंभ 'स्कोर' < 50 और> 20

df = df.drop(df[(df.score < 50) & (df.score > 20)].index)

+14

मैं सिर्फ टिप्पणी करना चाहता हूं कि ड्रॉप फ़ंक्शन इनस्थल प्रतिस्थापन का समर्थन करता है। अर्थात,। आपका समाधान df.drop (df [df.score <50] .index, inplace = True) जैसा ही है। फिर भी "इंडेक्स" चाल नहीं पता था।मुझे बहुत मदद मिली – Quickbeam2k1

+1

सिंटैक्स क्या है, यदि आप 50 से कम और 20 से अधिक स्कोर छोड़ना चाहते हैं? धन्यवाद। –

+1

@ tommy.carstensen: संपादित उत्तर – User

24

मैं इस के लिए एक समाधान के लिए देख रहा था है निकालने के लिए और मैं एक स्पष्ट दृष्टिकोण है जो सिर्फ फिल्टर करने के लिए है पर ठोकर खाई डेटा फ्रेम और मूल डेटा फ्रेम करने के लिए वापस आवंटित तो

df= df[df["score"] > 50] 
संबंधित मुद्दे