2016-03-22 4 views
1

Ich möchte Zeilen filtern, wenn Zelle Zeichenfolge enthält einen der Werte in der vordefinierten Gruppe.Wie filtert man Datenzeilen, wenn der Spaltenwert (String) einen der Werte in einem Satz in Python enthält?

Zum Beispiel für folgenden Datenrahmen:

ids ids2 vals 
0 a h a i  1 
1 b z n a  2 
2 f z c a  3 
3 n i n h  4 

Ich möchte folgende extrahierten Zeilen (die Zeilen, die 'h' oder 'i' in der ids Spalte):

ids ids2 vals 
0 a h a i  1 
3 n i n h  4 

Code generieren Datenrahmen:

d = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': ['a h', 'b z', 'f z', 'n i'],'ids2': ['a i', 'n a', 'c a', 'n h']}) 

Was ich bisher getan haben:

d[d['ids'].str.contains('h')|d['ids'].str.contains('i')] 

Hier ist das vordefinierte Set klein und enthält Groß- und Kleinschreibung. Gibt es eine Möglichkeit, dies entweder mit Groß-und Kleinschreibung oder mit einer Liste enthält Methode. Ich habe versucht, dies zu tun:

d[len(re.findall('h|i',d['ids'].str,re.IGNORECASE)) > 0] 

aber es gibt mir TypeError: expected string or bytes-like object.

oder dies:

data[any(d['name'].str.contains(x) for x in ['h','i'])] 

gibt Fehler: KeyError: 'name' jemand mir dabei helfen?

Antwort

2

Verwenden case = False macht es Groß- und Kleinschreibung:

d[d['ids'].str.contains('h', case=False)|d['ids'].str.contains('i',case=False)]

Dies ist definitiv ein wenig Kreisverkehr aber es wird funktionieren:

letters = ['h', 'i'] 
d[d['ids'].str.split().apply(lambda x: len(set(x).intersection(set(letters))))>0] 
+0

Ok. Selbst dann werde ich eine Menge von 'oder' Aussagen für eine größere Liste schreiben müssen – harshit

+0

Bearbeitete die Frage, um obigen Kommentar klarer zu machen – harshit

+0

@harshit die aktuelle Lösung wird funktionieren, solange Sie alle möglichen Buchstaben in 'Buchstaben' angeben –

1

Sie dies, indem ein regex leicht tun können, verbindet die Begriffe:

In [132]: 
d[~d['ids'].str.contains('h|i', case=False)] 

Out[132]: 
    ids ids2 vals 
1 b z n a  2 
2 f z c a  3 
Verwandte Themen