J'ai un ensemble de données avec 19 colonnes et environ 250k lignes. J'ai travaillé avec de plus grands ensembles de données, mais cette fois, les Pandas ont décidé de jouer avec mes nerfs.
J'ai essayé de diviser le jeu de données d'origine en 3 sous-cadres de données en fonction de quelques règles simples. Cependant, l'exécution du code prend beaucoup de temps. Environ 15-20 secondes juste pour le filtrage.
Une autre façon d'améliorer les performances du code?
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()
Au final, j'ai les df1, df2, df
dataframes avec les données filtrées.
la source
Avez-vous chronométré la ligne de votre code qui prend le plus de temps? Je soupçonne que la ligne
df = df[~df.isin(df1)].dropna()
prendrait beaucoup de temps. Serait-il plus rapide si vous utilisez simplement la négation de la condition que vous avez appliquée pour obtenirdf1
, lorsque vous souhaitez filtrer les lignesdf1
dedf
?Autrement dit, utilisez
df = df[(df.col1 != 10) | (df.col2 > 15)]
.la source
En plus des suggestions des autres réponses, il est utile d'ajouter les champs de recherche à l'index DataFrame. Réf: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html
Les DataFrames Pandas prennent également en charge le multi-index. Réf: https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html
Un exemple peut être trouvé ici https://stackoverflow.com/a/58061800/2130670
la source