Migliora la velocità di filtraggio dei frame di dati Pandas


9

Ho un set di dati con 19 colonne e circa 250k righe. Ho lavorato con set di dati più grandi, ma questa volta Pandas ha deciso di giocare con i miei nervi.

Ho provato a dividere il set di dati originale in 3 sub-frame di dati basati su alcune semplici regole. Tuttavia, l'esecuzione del codice richiede molto tempo. Circa 15-20 secondi solo per il filtraggio.

Qualche modo alternativo che migliorerà le prestazioni del codice?

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()

Alla fine, ho i df1, df2, dfframe di dati con i dati filtrati.

Risposte:


15

Il concetto da capire è che il condizionale è in realtà un vettore. Quindi, puoi semplicemente definire le condizioni e quindi combinarle logicamente, come:

condition1 = (df.col1 == 10) & (df.col2 <= 15)
condition2 = (df.col3 == 7) & (df.col4 >= 4)

# at this point, condition1 and condition2 are vectors of bools

df1 = df[condition1]
df2 = df[condition2 & ~condition1]
df = df[~ (condition1 | condition2)]

Questo sarà molto più veloce in quanto valuta il condizionale solo una volta. Quindi li utilizza per eseguire una ricerca indicizzata per creare i nuovi frame di dati più piccoli.


In caso di presenza di None o NaN, fai attenzione che la logica booleana potrebbe non funzionare su di essi.
kawingkelvin,

5

Hai cronometrato quale riga del tuo codice richiede più tempo? Ho il sospetto che la linea df = df[~df.isin(df1)].dropna()richiederebbe molto tempo. Sarebbe più veloce se utilizzassi semplicemente la negazione della condizione che hai applicato per ottenere df1, quando vuoi filtrare le righe df1da df?

Cioè, usa df = df[(df.col1 != 10) | (df.col2 > 15)].


+1 per raccomandare il cronometraggio di ogni riga
kbrose

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.