2017-09-06 3 views
4

J'ai environ 50 fichiers Excel & Je veux importer à dataframe et fusionner tous les fichiers dans une seule image. Mais certains fichiers ont 3 sont 4 colonnes. Chaque fichier sous forme de colonnes différentes dans un ordre différent.Faire correspondre les colonnes et ajouter à la trame de données, Python 3.6

colonne Total distinct de tous les fichiers: 5 i.e. col1, col2, col3, col4, Col5

Je sais comment importer, mais en annexant face à problème.

Script:

dfAll = pd.DataFrame(columns=['col1', 'col2', 'col3', 'col4', 'col5')] 
df= pd.read_excel('FilePath', sheetname='data1') # contains 3 columns i.e col1, col2, col5 
columnsOFdf = df.columns 
dfAll[columnsOFdf] = dfAll.append(df) 

mais son donnant erreur "ValueError: Les colonnes doivent être la même longueur que la clé"

Je veux ajouter df [ 'col1', 'col2', 'Col5' ] données à dfAll ['col1', 'col2', 'col5']

S'il vous plaît aider à ce problème.

+2

Vous essayez d'ajouter une base de données de taille 3 à une base de données de taille 5, qui ne fonctionnera pas avec des ensembles de données sans type – Sentinel

+0

@Sentinel, merci pour la réponse, une autre solution? –

+0

Je ne suis pas bien référencé dans l'utilisation de python en termes de dataFrames, vous aurez probablement besoin de créer une nouvelle dataframe incluant seulement les colonnes que vous voulez ajouter à l'autre dataframe – Sentinel

Répondre

2

Enchaînement correspondra à vos colonnes

dfs = [] 
files = [...] 
for file_name in files: 
    dfs.append(pd.read_excel(file_name, sheetname='data1')) 
df = pd.concat(dfs) 

df1 = pd.DataFrame(np.random.randn(3, 3), columns=list('ABC')) 
df2 = pd.DataFrame(np.random.randn(3, 3), columns=list('BCD')) 
>>> pd.concat([df1, df2]) 
      A   B   C   D 
0 -2.329280 0.644155 -0.835137  NaN 
1 0.666496 -1.299048 0.111579  NaN 
2 1.855494 -0.085850 -0.541890  NaN 
0  NaN -1.131514 1.023610 -0.514384 
1  NaN 0.670063 1.403143 -0.978611 
2  NaN -0.314741 -0.727200 -0.620511 

En outre, chaque fois que vous ajoutez un dataframe à un existant, il retourne une copie . Cela va sérieusement dégrader les performances et est appelé une copie quadratique. Il est préférable de créer une liste de toutes les données, puis de concaténer le résultat.

+0

merci beaucoup de travail bien ... –

1

Une solution consiste à ajouter des colonnes vides aux dataframes que vous chargez des fichiers Excel:

columns = ['col1', 'col2', 'col3', 'col4', 'col5'] 
dfAll = pd.DataFrame(columns=columns) 
df= pd.read_excel('FilePath', sheetname='data1') # contains 3 columns i.e    col1, col2, col5 
columnsOFdf = df.columns 
for column in columns: 
    if column not in columnsOFdf: 
     df[column] = [""] * df.shape[0] 
dfAll.append(df) 
+3

Ceci est une bonne solution de contournement si vous avez besoin de garder l'extra colonnes avec les nouvelles données. Peut-être qu'un espace réservé au lieu d'un espace vide serait une bonne idée. Mais si les données ne sont pas nécessaires, je suggérerais de créer une nouvelle dataframe – Sentinel

+0

@Sentinel, travaillera sur ceci ... merci –

1

essayez ceci:

[dfAll.append(i) for i in df] 

J'espère que cela vous aide.

+0

Erreur: TypeError: impossible de concaténer un objet non-NDFrame –

+0

type (dfAll) >>, tapez (df) >>