2016-07-13 1 views
0

J'ai actuellement de 30 tables individuelles dans un dossier qui sont dans ce format:Pandas: Fusionner plusieurs tables (~ 30) ensemble?

Name1 = pd.read_csv ('Name1.txt')

Name1:

  A B C D  
type1 1 1 NaN 4 
type2 2 0 NaN 2 
type3 3 2.1 NaN .2 
type4 1 2 NaN 1 

Je 30 ont comme ces tables et que vous souhaitez obtenir un tableau complet qui ressemble à ceci:

 Name1/A Name1/B Name1/D Name2/A Name2/B Name2/C ...... Name30/C 
type1 1  1  4  ...  ...  ...    ...   
type2 2  0  2  ...  ...  ...    ... 
type3 3  2.1  .2  ...  ...  ...    ... 
type4 1  2  1  ...  ...  ...    ... 

je tente d'utiliser une boucle pour lire en t Les données et l'utilisation de pd.concat (...) mais il ne semble pas faire quoi que ce soit

Je suppose que l'un de mes principaux problèmes est de comprendre comment je suis supposé créer une base de données qui combine tous ces différents graphiques sans avoir à faire pd.read_csv ('NameX.txt') pour TOUTES les 30 tables et ensuite les fusionner toutes ensemble. Je suppose que pour les boucles serait le sauveur principal pour cela, mais chaque fois que j'essaie de les lire dans une boucle for, il me dit que le fichier ne peut pas être trouvé.

Aussi, si cela aide, mes fichiers sont nommés dans tels "Name1.txt", "Name2.txt", "Name3.txt" ... et ainsi de suite, aussi la colonne de type1 à type4 ne change pas tout au long chaque graphique et les colonnes avec des valeurs NaN sont censés être supprimés dans la table finale plus grande.

Toutes les suggestions seraient incroyables! Merci!

+0

Est-ce que [Pandas Panel] (http://pandas.pydata.org/pandas-docs/stable/dsintro.html#panel) travaille pour vous? – gabra

+0

Oui! Je crois que j'ai pandas.Panel! As tu des idées? –

+0

Pour votre commentaire ci-dessous, il semble que vous voulez tout dans ** un ** DataFrame. Le Panel vous donnera plusieurs DataFrames. – gabra

Répondre

1

Essayez:

names = ['Name{}'.format(i) for i in xrange(1, 31)] 
files = ['{}.txt'.format(n) for n in names] 

df = pd.concat([pd.read_csv(f, index_col=0) for f in files], 
       axis=1, keys=names) 

cols = df.columns.to_series() 
df.columns = cols.str.get(0).astype(str) + '/' + cols.str.get(1) 

df.iloc[:, :10] 

enter image description here

+0

Merci pour l'entrée! J'ai essayé cela et j'ai essayé de le changer un petit peu parce que cela me donne une colonne avec tout ce qui est ensemble dans cette colonne, ce qui rend les données extrêmement compliquées et complexes. Je suis heureux que maintenant tout semble être dans un seul cadre de données, mais maintenant j'essaie de le manipuler dans diverses colonnes. –

+0

@CallieJester Le paramètre 'axis = 1' devrait s'assurer que la trame retournée par chaque' pd.read_csv' est concaténée côte à côte. Pouvez-vous montrer le code que vous utilisez actuellement? Ou la sortie que vous obtenez? – piRSquared

+0

Mon code est presque identique à celui que vous avez suggéré. La seule différence est que je mets des noms dans une liste de noms. La sortie pour les colonnes est comme: Name1.ABCDABCDABC ext ... –

1

Si vous ne Whish pas tout en un seul dataframe vous pouvez essayer Pandas Panel

dfs = {n:pd.read_csv('Name{}.txt'.format(n) for n in range(1,30)} 
panel = pd.Panel(dfs) 

Pour plus d'informations, vous pouvez vérifier this.