Si vous connaissez le nombre d'entrées ex ante, vous devriez pré-allouer l'espace en fournissant également l'index (en reprenant l'exemple des données d'une autre réponse) :
import pandas as pd
import numpy as np
# we know we're gonna have 5 rows of data
numberOfRows = 5
# create dataframe
df = pd.DataFrame(index=np.arange(0, numberOfRows), columns=('lib', 'qty1', 'qty2') )
# now fill it up row by row
for x in np.arange(0, numberOfRows):
#loc or iloc both work here since the index is natural numbers
df.loc[x] = [np.random.randint(-1,1) for n in range(3)]
In[23]: df
Out[23]:
lib qty1 qty2
0 -1 -1 -1
1 0 0 0
2 -1 0 -1
3 0 -1 0
4 -1 0 0
Comparaison des vitesses
In[30]: %timeit tryThis() # function wrapper for this answer
In[31]: %timeit tryOther() # function wrapper without index (see, for example, @fred)
1000 loops, best of 3: 1.23 ms per loop
100 loops, best of 3: 2.31 ms per loop
Et - d'après les commentaires - avec une taille de 6000, la différence de vitesse devient encore plus grande :
L'augmentation de la taille du tableau (12) et du nombre de rangées (500) rend la différence de vitesse est plus frappante : 313 ms contre 2,29 s.
79 votes
Notez que c'est une façon très inefficace de construire un grand DataFrame ; de nouveaux tableaux doivent être créés (en copiant les données existantes) lorsque vous ajoutez une ligne.
6 votes
@WesMcKinney : Thx, c'est vraiment bon à savoir. Est-il très rapide d'ajouter colonnes à des tables énormes ?
5 votes
Si cela est trop inefficace pour vous, vous pouvez préallouer une ligne supplémentaire et la mettre à jour ensuite.
24 votes
Hé toi... oui, vous ... Je vois ce que vous êtes en train de faire... vous voulez exécuter ceci à l'intérieur d'une boucle et ajouter itérativement des lignes à un DataFrame vide, n'est-ce pas... bien, ne le faites pas !
2 votes
Je peux comprendre que cela peut être faux en général, mais qu'en est-il du traitement en temps réel ? Disons que j'ai des données qui arrivent toutes les secondes et que j'ai un thread qui veut juste remplir un cadre de données et un autre thread basé sur le temps pair qui va regarder le cadre de données ? Je trouve ce cas d'utilisation valide et cette solution est applicable à
1 votes
@Giuseppe alors pandas DataFrame n'est pas la bonne structure de données, puisqu'elle est conçue pour l'analyse, pas pour le traitement en temps réel.
0 votes
Merci @justhalf, je suppose que c'est à cause de la façon dont il est implémenté qu'il ne sera pas adapté à ce genre de scénarios. En creusant un peu, j'ai trouvé ceci matthewrocklin.com/blog/work/2017/10/16/streaming-dataframes-1 Je ne suis pas sûr que ce soit la bonne solution, mais je vais sûrement essayer.