914 Stimmen

Pandas DataFrame nach Teilstring-Kriterien filtern

Ich habe ein Pandas DataFrame mit einer Spalte von String-Werten. Ich muss Zeilen basierend auf partiellen String-Übereinstimmungen auswählen.

So etwas wie diese Redewendung:

re.search(pattern, cell_in_question) 

einen booleschen Wert zurückgibt. Ich bin vertraut mit der Syntax von df[df['A'] == "hello world"] aber ich kann keine Möglichkeit finden, dasselbe mit einer teilweisen Zeichenkettenübereinstimmung zu tun, z. B. 'hello' .

26voto

cardamom Punkte 5987

Sollten Sie eine Groß- und Kleinschreibung wird nicht berücksichtigt Suche nach einer Zeichenkette in einer Pandas-Dataframe-Spalte:

df[df['A'].str.contains("hello", case=False)]

23voto

Mike Punkte 6583

Angenommen, Sie haben Folgendes DataFrame :

>>> df = pd.DataFrame([['hello', 'hello world'], ['abcd', 'defg']], columns=['a','b'])
>>> df
       a            b
0  hello  hello world
1   abcd         defg

Sie können jederzeit die in Operator in einem Lambda-Ausdruck, um Ihren Filter zu erstellen.

>>> df.apply(lambda x: x['a'] in x['b'], axis=1)
0     True
1    False
dtype: bool

Der Trick dabei ist die Verwendung der axis=1 Option in der apply um Elemente zeilenweise an die Lambda-Funktion zu übergeben, im Gegensatz zu spaltenweise.

16voto

svp Punkte 1554

Sie können versuchen, sie als String zu betrachten:

df[df['A'].astype(str).str.contains("Hello|Britain")]

9voto

Angenommen, wir haben eine Spalte namens "ENTITY" im Datenrahmen df . Wir können unsere df ,um den gesamten Datenrahmen zu haben df , wobei die Zeilen der Spalte "Entität" nicht "DM" enthalten, indem eine Maske wie folgt verwendet wird:

mask = df['ENTITY'].str.contains('DM')

df = df.loc[~(mask)].copy(deep=True)

6voto

euforia Punkte 8245

Hier ist, was ich am Ende tun für teilweise Zeichenfolge Übereinstimmungen. Wenn jemand einen effizienteren Weg, dies zu tun hat, lassen Sie mich bitte wissen.

def stringSearchColumn_DataFrame(df, colName, regex):
    newdf = DataFrame()
    for idx, record in df[colName].iteritems():

        if re.search(regex, record):
            newdf = concat([df[df[colName] == record], newdf], ignore_index=True)

    return newdf

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X