2
votes

Fractionner la très grande trame de données Pandas, alternative à Numpy array_split

Avez-vous des idées sur la limite de lignes pour utiliser la méthode Numpy array_split ?

J'ai un dataframe avec + 6 millions de lignes et je voudrais le diviser en une vingtaine de morceaux.

Ma tentative a suivi celle décrite dans: Fractionner une grande trame de données pandas

à l'aide de Numpy et de la fonction array_split , mais étant une très grande dataframe , cela continue indéfiniment.

Mon dataframe est df qui comprend 8 colonnes et 6,6 millions de lignes. p >

df_split = np.array_split(df,20)

Des idées sur une méthode alternative pour diviser cela? Des conseils pour améliorer les performances du dataframe sont également les bienvenus.


6 commentaires

Comment le tableau devrait-il être? combien de lignes par tableau? Vous pourriez peut-être le faire dans une boucle ou une compréhension de liste. Changez également pour (df.values, 20) et voyez si c'est plus rapide


Avez-vous également essayé ceci ?


Étant donné qu'il s'agit de 6,6 millions de lignes, la division n = 20 signifierait environ 330 000 lignes par tableau. Cependant, cette répartition est un peu arbitraire, peut être de 10, 20 ou 100, mon objectif est en termes de performances.


Merci @markuscosinus. Oui, mais cela ne semblait pas fonctionner non plus, alors je suis revenu à la méthode originale.


Avez-vous essayé d'utiliser simplement l'ancien .iloc , puis peut-être enregistrer chaque vue dans un fichier et travailler avec chaque fichier individuellement?


Que faites-vous après votre séparation? si vous effectuez des calculs similaires sur chaque section, pensez à groupby avec dask.dataframe .


3 Réponses :


1
votes

Je n'ai pas de solution générale, mais il y a deux choses à considérer:

  1. Vous pouvez essayer de charger les données par blocs, au lieu de les charger puis de les fractionner. Si vous utilisez pandas.read_csv , l'argument skiprows serait la voie à suivre.
  2. Vous pouvez remodeler vos données avec df.values.reshape ((20, -1,8)) . Cependant, cela nécessiterait que le nombre de lignes soit divisible par 20. Vous pourriez envisager de ne pas utiliser le dernier (un maximum de 19) des échantillons pour l'adapter. Ce serait bien sûr la solution la plus rapide.

0 commentaires

1
votes

Cela résout peut-être votre problème en séparant le dataframe en bloc comme cet exemple:

import numpy as np
import pandas as pds

df = pds.DataFrame(np.random.rand(14,4), columns=['a', 'b', 'c', 'd'])

def chunker(seq, size):
    return (seq[pos:pos + size] for pos in range(0, len(seq), size))

for i in chunker(df,5):
    df_split = np.array_split(i, 20)
    print(df_split)


2 commentaires

Merci, jusqu'à présent, cette solution semble vous aider. Une partie de mon problème était de les générer afin de les importer sur bigquery. On dirait que cette solution permettra de casser correctement les données et de les insérer.


si vous voulez dire insérer des données dans la table, vous pouvez utiliser sqlalchemy également concaténer toute la valeur du morceau à l'intérieur de la même requête sql et faire une boucle à chaque morceau, cette meilleure solution pour améliorer les performances exemple: sqlinsert = "INSERT INTO table (col_1, col_2, col_3) VALUES ( "+ your_bid_data_implode +") "



0
votes

Avec quelques modifications sur le code de Houssem Maamria, ce fichier pourrait aider quelqu'un essayant d'exporter chaque morceau vers un fichier excel.

import pandas as pd
import numpy as np

dfLista_90 = pd.read_excel('my_excel.xlsx', index_col = 0) # to include the headers

count = 0
limit = 200
rows = len(dfLista_90)
partition = (rows // limit) + 1

def chunker(df, size):
    return (df[pos:pos + size] for pos in range(0, len(df), size))

for a in chunker(dfLista_90, limit):
    to_excel = np.array_split(a, partition)
    count += 1
    a.to_excel('file_{:02d}.xlsx'.format(count), index=True)


1 commentaires

Voici quelques conseils pour Comment rédiger une bonne réponse? . Cette réponse fournie peut être correcte, mais elle pourrait bénéficier d'une explication. Les réponses codées uniquement ne sont pas considérées comme de «bonnes» réponses. À partir de examen .