2017-11-27 7 views
3

Ich habe eine Tsv-Datei wie folgt.Identifizieren Sie bestimmte Wörter in Pandas Spalten

id ingredients recipe 
code1 egg, butter beat eggs. add unsalted butter 
code2 tim tam, butter beat tim tam. add butter 
code3 coffee, sugar add coffee and sugar and mix 
code4 sugar, fresh goat milk beat sugar and milk together 

Ich möchte die Einträge entfernen, wenn sie die unten genannten Wörter entweder ingredients oder recipe Spalte enthalten.

mylist = ['tim tam', 'unsalted butter', 'fresh goat milk'] 

Meine Ausgabe sollte wie folgt aussehen.

id ingredients recipe 
code3 coffee, sugar add coffee and sugar and mix 

Gibt es eine Möglichkeit, dies mit Pandas zu tun? Bitte hilf mir!

+1

Können Sie zeigen uns die Arbeit, die Sie bisher getan haben? – louisfischer

Antwort

2

Verwenden contains mit join, um zu sehen, ob eine "sub" string, und kommen mit Base Zeichenfolge enthält '|' um einen regulären Ausdruck:

mylist = ['tim tam','unsalted butter','fresh goat milk'] 
df[~(df.ingredients.str.contains('|'.join(mylist)) | 
    df.recipe.str.contains('|'.join(mylist)))] 

Ausgang:

 id ingredients      recipe 
2 code3 coffee, sugar add coffee and sugar and mix 
0

Schnellere Lösung ist Säulen miteinander verbinden und dann Werte überprüfen, indem contains:

df = df[~(df['ingredients'] + df['recipe']).str.contains('|'.join(mylist))] 
print (df) 
     id ingredients      recipe 
2 code3 coffee, sugar add coffee and sugar and mix 

Eine andere Lösung:

Verwenden contains für beide Spalten, dann Kette von | und inverse Maske mit ~:

m1 = df['ingredients'].str.contains('|'.join(mylist)) 
m2 = df['recipe'].str.contains('|'.join(mylist)) 
m = m1 | m2 
print (m) 
0  True 
1  True 
2 False 
3  True 
dtype: bool 

df = df[~m] 
print (df) 
     id ingredients      recipe 
2 code3 coffee, sugar add coffee and sugar and mix 

Zeiten :

#[40000 rows x 3 columns] 
df = pd.concat([df]*10000).reset_index(drop=True) 

In [358]: %timeit df[~(df['ingredients'] + df['recipe']).str.contains('|'.join(mylist))] 
10 loops, best of 3: 47.8 ms per loop 

In [359]: %timeit df[~(df['ingredients'].str.contains('|'.join(mylist))|df['recipe'].str.contains('|'.join(mylist)))] 
10 loops, best of 3: 78.2 ms per loop 
Verwandte Themen