Tengo un conjunto de datos con 19 columnas y aproximadamente 250k filas. He trabajado con conjuntos de datos más grandes, pero esta vez, Pandas decidió jugar con mis nervios.
Traté de dividir el conjunto de datos original en 3 subtramas de datos basados en algunas reglas simples. Sin embargo, lleva mucho tiempo ejecutar el código. Unos 15-20 segundos solo para el filtrado.
¿Alguna forma alternativa de mejorar el rendimiento del código?
import pandas as pd
#read dataset
df = pd.read_csv('myData.csv')
#create a dataframe with col1 10 and col2 <= 15
df1 = df[(df.col1 == 10) & (df.col2 <= 15)]
df = df[~df.isin(df1)].dropna()
#create a dataframe with col3 7 and col4 >= 4
df2 = df[(df.col3 == 7) & (df.col4 >= 4)]
df = df[~df.isin(df2)].dropna()
Al final, tengo los df1, df2, df
marcos de datos con los datos filtrados.
fuente
¿Ha cronometrado qué línea de su código consume más tiempo? Sospecho que la línea
df = df[~df.isin(df1)].dropna()
tomaría mucho tiempo. ¿Sería más rápido si se utiliza simplemente la negación de la condición que se aplica para obtenerdf1
, cuando se desea filtrar filas de distancia dedf1
dedf
?Es decir, uso
df = df[(df.col1 != 10) | (df.col2 > 15)]
.fuente
Además de las sugerencias en las otras respuestas, ayuda si agregamos los campos de búsqueda al índice de DataFrame. Ref: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html
Pandas DataFrames también admite múltiples índices. Ref: https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html
Un ejemplo se puede encontrar aquí https://stackoverflow.com/a/58061800/2130670
fuente