Python / Pandas: suelte las filas del dataframe en una cadena que coincida con la lista

Tengo un archivo .csv de información de contacto que importo como un dataframe de pandas.

>>> import pandas as pd >>> >>> df = pd.read_csv('data.csv') >>> df.head() fName lName email title 0 John Smith jsmith@gmail.com CEO 1 Joe Schmo jschmo@business.com Bagger 2 Some Person some.person@hotmail.com Clerk 

Después de importar los datos, me gustaría soltar filas donde un campo contiene una de varias subcadenas en una lista. Por ejemplo:

 to_drop = ['Clerk', 'Bagger'] for i in range(len(df)): for k in range(len(to_drop)): if to_drop[k] in df.title[i]: # some code to drop the rows from the data frame df.to_csv("results.csv") 

¿Cuál es la forma preferida de hacer esto en Pandas? ¿Debería esto ser incluso un paso de post-procesamiento, o es preferible filtrarlo antes de escribir en el dataframe en primer lugar? Mi pensamiento fue que esto sería más fácil de manipular una vez en un objeto de dataframe.

Use isin y pase su lista de términos para buscar, luego puede negar la máscara booleana usando ~ y esto filtrará esas filas:

 In [6]: to_drop = ['Clerk', 'Bagger'] df[~df['title'].isin(to_drop)] Out[6]: fName lName email title 0 John Smith jsmith@gmail.com CEO 

Otro método es unir los términos para que se convierta en una expresión regular y utilice el str.contains str.contains :

 In [8]: df[~df['title'].str.contains('|'.join(to_drop))] Out[8]: fName lName email title 0 John Smith jsmith@gmail.com CEO 

En mi opinión, será más fácil y probablemente más rápido realizar el filtrado como un paso de procesamiento posterior, ya que si decide filtrar mientras lee, está aumentando iterativamente el dataframe, lo que no es eficiente.

Alternativamente, puede leer el csv en fragmentos, filtrar las filas que no desea y agregar los fragmentos a su csv de salida

Otra forma de utilizar la query

 In [961]: to_drop = ['Clerk', 'Bagger'] In [962]: df.query('title not in @to_drop') Out[962]: fName lName email title 0 John Smith jsmith@gmail.com CEO