2012-12-13 8 views
78

Ich habe einen Pandas DataFrame und ich möchte Zeilen löschen, wo die Länge der Zeichenfolge in einer bestimmten Spalte größer als 2 ist. Ich weiß, ich kann df.dropna() verwenden um Zeilen loszuwerden, die NaN enthalten, aber ich sehe nicht, wie Zeilen basierend auf einem bedingten Ausdruck entfernt werden.Wie lösche Zeilen von einem Pandas DataFrame basierend auf einem bedingten Ausdruck

Die Antwort für this question sehr nahe scheint, was ich will - es scheint, als ob ich in der Lage sein sollte, so etwas zu tun:

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

aber bekomme ich nur die Fehlermeldung:

KeyError: u'no item named False' 

Kann mir jemand sagen, was ich falsch mache?

Antwort

55

Wenn Sie len(df['column name']) tun, erhalten Sie nur eine Zahl, nämlich die Anzahl der Zeilen im DataFrame (d. H. Die Länge der Spalte selbst). Wenn Sie len auf jedes Element in der Spalte anwenden möchten, verwenden Sie df['column name'].map(len). So versuchen

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

ich kam mit einer Art und Weise unter Verwendung einer Liste Verständnis auf: 'df [[(len (x) <2) für x in df [‚Spaltennamen‘ ]]]] aber dein ist viel schöner. Danke für Ihre Hilfe! – sjs

255

direkt auf diese Frage Titel zu beantworten (was ich verstehen, ist nicht unbedingt das Problem des OP konnte aber anderen Benutzern helfen, über diese Frage kommen) eine Möglichkeit, dies zu tun, ist die drop Methode verwenden:

df = df.drop(some labels)

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

Beispiel

Um alle Zeilen zu entfernen, wo Spalte 'Score' < 50:

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

Anstelle Version

(wie in Kommentaren darauf hingewiesen)

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

Mehrere Bedingungen

(siehe Boolean Indexing)

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

Um alle Zeilen zu entfernen, wo Spalte ‚Score‘ ist < 50 und> 20

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

+14

Ich möchte nur bemerken, dass die Drop-Funktion unterstützt Inplace-Ersatz. Z. Ihre Lösung ist dasselbe wie df.drop (df [df.score <50] .index, inplace = True). Trotzdem kannte ich den "Index" -Track nicht.Hat mir sehr geholfen – Quickbeam2k1

+1

Was ist die Syntax, wenn Sie Scores von weniger als 50 und mehr als 20 fallen lassen wollen? Vielen Dank. –

+1

@ tommy.carstensen: bearbeitete Antwort – User

24

ich nach einer Lösung dieses Problems suchen und ich auf einem offensichtlichen Ansatz gestolpert, die nur filtern der Datenrahmen und weisen zurück, so auf den ursprünglichen Datenrahmen

df= df[df["score"] > 50] 
Verwandte Themen