2016-08-09 4 views
0

J'ai des tonnes de fichiers Excel. Chacun de ces fichiers contient une ou plusieurs variables pour tous les sujets à un certain moment. Pour chaque variable, j'ai, disons, 10 fichiers (en stockant la valeur de la variable à 10 moments différents). Mon but ultime est de créer une série de panneaux.Conversion de plusieurs DataFrames en Panel

Supposons qu'il n'y ait qu'une seule variable dans chaque fichier. Pour chaque variable (ou élément), j'initialise un DataFrame vide item = pd.DataFrame() et successivement lire et ajouter tous les 10 fichiers dans ce DataFrame vide item = item.append(pd.DataFrame(df)), où df provient du nouveau fichier. Chacune de ces 10 DataFrames a la cote 1 x #subjects, donc j'ai finalement 10 x #subject. Je transforme cela en un cadre de panneau en utilisant pf = pd.Panel({'variable name': item}). Maintenant, je peux facilement ajouter à un grand cadre de panneau avec beaucoup d'autres articles ...

Question: Qu'est-ce qu'un moyen facile et pratique d'aborder ce problème si j'ai 2 ou plusieurs variables dans chaque fichier ? Si je collé à l'approche ci-dessus, j'aurais une dataframe de dimension #variables x #subjects pour chaque fichier, conduisant à

    subject1 subject2 
variable1 2000  val   val 
variable2 2000  val   val 
variable1 2001  val   val 
variable2 2001  val   val 
... 

après les annexant. C'est évidemment une mauvaise structure pour convertir cela en données de panel.

Je pourrais travailler autour de moi - par ex. en ajoutant "la ligne correcte" pour garder la structure appropriée ou lire le même fichier autant de fois qu'il y a de variables - mais cela serait lourd et/ou coûteux. Il doit y avoir des méthodes qui font ce travail facilement, mais je ne pouvais pas les trouver dans les docs.

Merci pour votre aide.

Répondre

2

Un Panel est essentiellement une pile d'objets DataFrame, permettant d'explorer les données en trois dimensions. Ainsi, peu importe le nombre de variables ou de sujets représentés dans chacun de vos fichiers, à condition que chaque fichier ne représente qu'un point dans le temps. Importez chaque fichier dans un DataFrame, puis créez votre Panel. Cela peut être réalisé en utilisant une boucle for sur une liste de vos noms de fichiers. Dans votre boucle, vous pouvez vérifier l'année d'où proviennent les données et stocker les résultats dans un dictionnaire avec tous vos autres objets DataFrame, vous permettant ainsi de convertir facilement votre dictionnaire de données dans un panneau.

Si votre format DataFrame originale ressemble à quelque chose comme:

 Gerald Kate 
Var1  1  5 
Var2  2  6 
Var3  3  7 
Var4  4  8 

Ensuite, vous pouvez créer votre Panel avec quelque chose comme:

pn=pd.Panel(data={2010:df2010, 2015:df2015, 2020:df2020}) 

Ce yeilds un Panel avec les propriétés:

Dimensions: 3 (items) x 4 (major_axis) x 2 (minor_axis) 
Items axis: 2010 to 2020 
Major_axis axis: Var1 to Var4 
Minor_axis axis: Gerald to Kate 

Il est possible de trancher b année y:

print(pn[2015]) 


     Gerald Kate 
Var1  3 15 
Var2  6 18 
Var3  9 21 
Var4  12 24 

Il est également possible de commuter les axes pour obtenir une meilleure vue des variables individuelles ou sujets:

print(pn.transpose('minor_axis','major_axis','items')['Gerald']) 

     2010 2015 2020 
Var1  1  3  9 
Var2  2  6 18 
Var3  3  9 27 
Var4  4 12 36 
+1

Sur la base de votre réponse, @Alton Campbell, je me suis ce que je voulais: je initialiser une dict vide 'data = {}', insérer les données de chaque année dans une boucle via 'data [année] = df' (où df est le DataFrame d'une année à ajouter), configurer un panel' item = pd.Panel (data) 'et permuter les axes' item = item.swapaxes (axis1 = 'items', axis2 = 'majeur') '(car je veux que les années soient sur l'axe principal en accord avec les docs). Merci! – Jhonny