884 votes

Créer un DataFrame Pandas vide, puis le remplir ?

Je pars de la documentation de pandas DataFrame ici : http://pandas.pydata.org/pandas-docs/stable/dsintro.html

J'aimerais remplir itérativement le DataFrame avec des valeurs dans une sorte de calcul de série chronologique. En gros, j'aimerais initialiser le DataFrame avec les colonnes A, B et les lignes de timestamp, toutes à 0 ou toutes à NaN.

J'ajouterais ensuite des valeurs initiales et je passerais sur ces données en calculant la nouvelle ligne à partir de la ligne précédente, par exemple row[A][t] = row[A][t-1]+1 ou à peu près.

J'utilise actuellement le code ci-dessous, mais je pense que c'est un peu laid et qu'il doit y avoir un moyen de faire cela avec un DataFrame directement, ou juste une meilleure façon en général. Note : J'utilise Python 2.7.

import datetime as dt
import pandas as pd
import scipy as s

if __name__ == '__main__':
    base = dt.datetime.today().date()
    dates = [ base - dt.timedelta(days=x) for x in range(0,10) ]
    dates.sort()

    valdict = {}
    symbols = ['A','B', 'C']
    for symb in symbols:
        valdict[symb] = pd.Series( s.zeros( len(dates)), dates )

    for thedate in dates:
        if thedate > dates[0]:
            for symb in valdict:
                valdict[symb][thedate] = 1+valdict[symb][thedate - dt.timedelta(days=1)]

    print valdict

73 votes

Ne faites jamais croître un DataFrame ! Il est toujours plus économique d'ajouter une liste en python et de la convertir en DataFrame à la fin, tant en termes de mémoire que de performances.

1 votes

@cs95 Qu'est-ce qui est fonctionnellement différent entre .append dans pd et en ajoutant une liste ? Je sais .append dans pandas, on copie l'ensemble des données dans un nouvel objet ', est-ce que python append fonctionne différemment ?

4 votes

@Lamma veuillez trouver les détails dans ma réponse ci-dessous. Lors de l'ajout à df, un nouveau DataFrame est créé à chaque fois en mémoire au lieu d'utiliser celui existant, ce qui est franchement un gaspillage.

0voto

Voici ma méthode pour créer un cadre de données dynamique à partir de plusieurs listes avec une boucle.

x = [1,2,3,4,5,6,7,8]
y = [22,12,34,22,65,24,12,11]
z = ['as','ss','wa', 'ss','er','fd','ga','mf']
names = ['Bob', 'Liz', 'chop']

une boucle

def dataF(x,y,z,names):
    res = []

    for t in zip(x,y,z):
        res.append(t)

    return pd.DataFrame(res,columns=names)

Résultat

dataF(x,y,z,names)

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X