2016-08-16 2 views
5

Was ist der kürzeste Weg, um alle Zeilen auszuwählen, in denen eine Spalte eine Zeichenfolge in einem Pandas-Dataframe enthält?Konkreter Weg, um Zeilen auszuwählen, in denen jede Spalte eine Zeichenfolge in Pandas Dataframe enthält?

Zum Beispiel, was ist der beste Weg, die folgenden Zeilen zu wählen, wo der Wert in einer Spalte eine b enthält?

Ich bin unerfahren mit Pandas und das Beste, was ich mit so weit kommen habe, ist das recht umständlich df[df.apply(lambda r: r.str.contains('b').any(), axis=1)]. Gibt es eine einfachere Lösung?

Kritisch, ich möchte nach einer Übereinstimmung in keine Spalten, nicht eine bestimmte Spalte zu überprüfen. Andere ähnliche Fragen, so gut ich das beurteilen kann, betreffen nur eine einzelne oder eine Liste von Spalten.

+0

Mögliches Duplikat [Pandas + Datenrahmen - wählen Sie durch partiellen string] (http://stackoverflow.com/questions/11350770/pandas-dataframe-select-by-partial-string) – AChampion

+0

'.str.contains 'ist eine Methode, die auf pd.Series definiert ist, so dass es so oder so zu sein scheint, dass Sie apply oder irgendeine Art von Schleife verwenden müssen. Es könnte einige Hacks geben, die bs durch NaNs ersetzen und darauf basierend fallen, aber Ihr Weg scheint klarer zu sein. – ayhan

+1

Sie können auch 'df [df.sum (axis = 1) .str.contains ('b')]' tun, aber ich glaube nicht, dass dieses Verhalten zuverlässig ist. Ich denke auch nicht, dass dies ein Duplikat ist. – ayhan

Antwort

4

Diese Frage wurde keine Antwort gegeben .. aber die Frage selbst und die Kommentare haben die Antwort bereits, die wirklich gut für mich funktionierte .. und ich fand die Antwort nirgendwo auf der Welt.

Also ich kopierte einfach die Antwort für jemanden, der es nützlich finden kann. Ich habe Fall = False für einen Fall unempfindlich serach

Lösung von @Reason:

das Beste, was ich mit bisher eher umständlich habe kommen

dieses für mich gearbeitet .

df[df.apply(lambda r: r.str.contains('b', case=False).any(), axis=1)] 

Lösung von @rbinnun:

dies für mich für einen Test-Datensatz gearbeitet .. aber für einige echte Datensatz .. es eine Unicode-Fehler zurückgegeben, wie unten, aber in der Regel ein auch gute Lösung denke ich

df[df.apply(lambda row: row.astype(str).str.contains('b', case=False).any(), axis=1)]

kümmert sich um nicht-String-Spalten, nans usw.

UnicodeEncodeError: 'ascii' codec can't encode character u'\xae' in position 5: ordinal not in range(128) 
+0

Wenn Sie Python 2 verwenden, versucht der zweite, die Spalte in eine ASCII-Zeichenfolge umzuwandeln, daher der Unicode-Fehler. Umwandeln in 'unicode' statt: 'df [df.apply (lambda row: row.astype (unicode) .str.contains ('b', fall = False) .any(), axis = 1)]' – sundance

Verwandte Themen