2013-06-08 5 views
5

J'ai plusieurs trames de données avec des cours boursiers que je veux aligner dans une seule trame de données qui contient uniquement les prix de clôture pour toutes les actions.Fusionner plusieurs trames de données non alignées en une seule trame de données pandas

Je m'attendrais à ce que toutes les dates de toutes les trames de données soient présentes dans la colonne de date (index) et "NA" au cas où il n'y aurait pas de prix de clôture pour un stock à cette date.

Exemple avec deux données-cadres (DF1 et DF2):

In [5]: df1 
Out[5]: 
      Open High Low Close 
Date1 
2012-01-05 22.00 22.66 23.11 24.04 
2012-01-04 24.04 23.80 23.08 22.16 
2012-01-03 22.16 21.27 20.42 21.24 
2012-01-01 21.24 22.30 22.52 22.30 

In [7]: df2 
Out[7]: 
      Open High Low Close 
Date1 
2012-01-07 23.00 21.66 25.11 21.04 
2012-01-06 22.00 22.66 23.11 24.04 
2012-01-04 24.04 23.80 23.08 22.16 
2012-01-02 22.16 21.27 20.42 21.24 
2012-01-01 21.24 22.30 22.52 22.30 

Maintenant, je peux faire

In [8]: frame=pd.DataFrame({"df1.Close":df1["Close"], "df2.Close":df2["Close"]}) 

et le résultat est comme prévu:

In [9]: frame 
Out[9]: 
      df1.Close df2.Close 
Date1 
2012-01-01  22.30  22.30 
2012-01-02  NaN  21.24 
2012-01-03  21.24  NaN 
2012-01-04  22.16  22.16 
2012-01-05  24.04  NaN 
2012-01-06  NaN  24.04 
2012-01-07  NaN  21.04 

Comment se J'ai besoin de changer mon code pour faire la même chose pour un nombre dynamique de trames de données? À l'heure actuelle, j'ai 8 trames de données dont j'ai besoin pour m'aligner de cette façon. Est-il possible de faire une boucle dans une liste de trames de données et de les aligner comme ci-dessus - au lieu de lier manuellement les noms des trames de données (quelque chose comme df [0] à df [7] au sens figuré)?

Merci d'avance et de gentilles salutations! Dirk

Répondre

4

Si vous avez les données-cadres dans une liste (les objets réels trame de données, je veux dire, pas leurs noms) qui ressemble à quelque chose comme ceci:

dflist = [df1, df2, df3, df4, df5, df6, df7, df8] 

alors le code suivant devrait faire ce qu'il vous semble que vous cherchez:

frame = {} 
for idx, df in enumerate(dflist): 
    n = idx+1 # Since lists are 0-indexed 
    name = "df{0:d}.Close".format(n) 
    close = df["Close"] 
    frame[name] = close 

vous pouvez le faire avec une plus compacte compréhension dict, mais dans le code exemple je préfère les choses plus épeler explicitement pour faciliter la compréhension. Pour référence, la compréhension dict devrait ressembler à quelque chose comme ceci:

{"df{0:d}.Close".format(idx+1): df["Close"] for idx, df in enumerate(dflist)} 
+0

Très cool, merci beaucoup! Avec cet exemple, je suis à mi-chemin. Maintenant, comment pourrais-je rendre ce "dflist" dynamique? Je ne saurai pas à l'avance combien de trames de données je vais avoir besoin - donc je suppose que je cherche un moyen de créer dynamiquement un certain nombre de trames de données et ensuite utiliser votre code. Merci beaucoup pour votre aide! – user1653205

+0

Utilisez simplement des méthodes standard de manipulation de liste comme 'append()'. Par exemple, lorsque vous obtenez une nouvelle trame de données, faites quelque chose comme 'dflist.append (new_df)'. – rmunn

+0

Je pense que je me rapproche. J'ai maintenant chargé les données dans un dict où la clé est le ticker du stock et la valeur est l'image avec des citations OHLC pour le stock. Maintenant, j'ai une dict avec 8 paires clé/valeur. La question restante est: Comment joindre les dataframes en un en itérant à travers mon dict? – user1653205

Questions connexes