Ho un grande dataframe (diverse milioni di righe).Come eseguire iterate su blocchi consecutivi di dataframe Pandas in modo efficiente
Desidero essere in grado di eseguire un'operazione di groupby su di esso, ma semplicemente raggruppando sottoinsiemi di righe consecutivi (preferibilmente di dimensioni uguali) anziché utilizzare una particolare proprietà delle singole righe per decidere a quale gruppo vanno .
Il caso d'uso: voglio applicare una funzione a ciascuna riga tramite una mappa parallela in IPython. Non importa quali file vanno a quale motore di back-end, poiché la funzione calcola un risultato basato su una riga alla volta. (Concettualmente, almeno, in realtà è vettorializzare.)
mi è venuta in mente qualcosa di simile:
# Generate a number from 0-9 for each row, indicating which tenth of the DF it belongs to
max_idx = dataframe.index.max()
tenths = ((10 * dataframe.index)/(1 + max_idx)).astype(np.uint32)
# Use this value to perform a groupby, yielding 10 consecutive chunks
groups = [g[1] for g in dataframe.groupby(tenths)]
# Process chunks in parallel
results = dview.map_sync(my_function, groups)
Ma questo sembra molto prolisso, e non garantisce pezzi uguali dimensioni. Soprattutto se l'indice è scarso o non intero o altro.
Qualche suggerimento per un modo migliore?
Grazie!
Questo era quello che avevo in mente! Bene tecnicamente "df.groupby (np.arange (len (df)) // (len (df)/10))" per ottenere un numero fisso di gruppi (1 per core) invece di dimensione fissa. Per qualche ragione non mi era mai venuto in mente che la chiave di raggruppamento non fosse effettivamente correlata all'indice ... –
Vale la pena ricordare che per efficienza è probabilmente meglio leggere il file originale usando un "iteratore" (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html) e un "chunksize" in modo che la funzione read_csv faccia la lettura e che ciascun frammento possa essere passato a un processo separato come descritto da @ Ryan –