2015-12-12 15 views
5

Ho n file in una directory che ho bisogno di combinare in uno. Essi hanno la stessa quantità di colonne, ad esempio, il contenuto di test1.csv sono:utilizzando panda in python per aggiungere file CSV in uno

test1,test1,test1 
test1,test1,test1 
test1,test1,test1 

Allo stesso modo, il contenuto di test2.csv sono:

test2,test2,test2 
test2,test2,test2 
test2,test2,test2 

voglio final.csv di simile a questa:

test1,test1,test1 
test1,test1,test1 
test1,test1,test1 
test2,test2,test2 
test2,test2,test2 
test2,test2,test2 

ma invece viene fuori in questo modo:

test file 1,test file 1.1,test file 1.2,test file 2,test file 2.1,test file 2.2 
,,,test file 2,test file 2,test file 2 
,,,test file 2,test file 2,test file 2 
test file 1,test file 1,test file 1,,, 
test file 1,test file 1,test file 1,,, 

Qualcuno può aiutarmi a capire cosa sta succedendo qui? Ho incollato il mio codice di seguito:

import csv 
import glob 
import pandas as pd 
import numpy as np 

all_data = pd.DataFrame() #initializes DF which will hold aggregated csv files 

for f in glob.glob("*.csv"): #for all csv files in pwd 
    df = pd.read_csv(f) #create dataframe for reading current csv 
    all_data = all_data.append(df) #appends current csv to final DF 

all_data.to_csv("final.csv", index=None) 
+0

Perché stai usando i Panda solo per creare un singolo CSV? –

+0

Sono un noob e ho pensato che fosse il modo migliore per farlo. :/ –

risposta

5

Penso che ci siano più problemi:

  1. ho rimosso import csv e import numpy as np, perché in questa demo non vengono utilizzati (ma forse a mancare, le linee in modo che possano essere importati)
  2. ho creato elenco di tutti i dataframmi dfs, in cui i dataframes sono allegati da dfs.append(df). Quindi ho usato la funzione concat per unire questo elenco al dataframe finale.
  3. Nella funzione read_csv ho aggiunto il parametro header=None, perché il problema principale era che read_csv legge la prima riga come header.
  4. Nella funzione to_csv ho aggiunto il parametro header=None per omettere l'intestazione.
  5. Ho aggiunto la cartella test al file di destinazione finale, perché se si utilizza la funzione glob.glob("*.csv") si dovrebbe leggere il file di output come file di input.

Soluzione:

import glob 
import pandas as pd 

all_data = pd.DataFrame() #initializes DF which will hold aggregated csv files 

#list of all df 
dfs = [] 
for f in glob.glob("*.csv"): #for all csv files in pwd 
    #add parameters to read_csv 
    df = pd.read_csv(f, header=None) #create dataframe for reading current csv 
    #print df 
    dfs.append(df) #appends current csv to final DF 
all_data = pd.concat(dfs, ignore_index=True) 
print all_data 
#  0  1  2 
#0 test1 test1 test1 
#1 test1 test1 test1 
#2 test1 test1 test1 
#3 test2 test2 test2 
#4 test2 test2 test2 
#5 test2 test2 test2 
all_data.to_csv("test/final.csv", index=None, header=None) 

soluzione successivo è simile.
Aggiungere il parametro header=None a read_csv e to_csv e aggiungere il parametro ignore_index=True a append.

import glob 
import pandas as pd 

all_data = pd.DataFrame() #initializes DF which will hold aggregated csv files 

for f in glob.glob("*.csv"): #for all csv files in pwd 
    df = pd.read_csv(f, header=None) #create dataframe for reading current csv 
    all_data = all_data.append(df, ignore_index=True) #appends current csv to final DF 
print all_data 
#  0  1  2 
#0 test1 test1 test1 
#1 test1 test1 test1 
#2 test1 test1 test1 
#3 test2 test2 test2 
#4 test2 test2 test2 
#5 test2 test2 test2 

all_data.to_csv("test/final.csv", index=None, header=None) 
+0

Wow grazie! Ci proverò stasera! –

+1

Penso che 'pandas' sia un'ottima libreria per l'elaborazione dei dati. Quindi puoi provarlo. E se sei nuovo in StackOverflow, puoi controllare [questo] (http://stackoverflow.com/tour). – jezrael

+0

Sebbene ci fossero altre buone spiegazioni sui metodi più efficienti dell'uso dei panda in questo contesto, questa soluzione ha funzionato al meglio per me. –

2

È possibile concat. Diciamo df1 essere la vostra prima dataframe e df2 il secondo, è possibile:

df = pd.concat([df1,df2],ignore_index=True) 

Il ignore_index è opzionale, è possibile impostare a True se non ti dispiace gli indici originali dei singoli dataframes.

+1

Funzionerà, se si passa "axis = 0" come parametro. – hahdawg

+0

@hahdawg grazie per avermelo fatto notare. In realtà 0 è il valore predefinito per 'axis' in' concat'. –

+0

Grazie. Cercherò di implementarlo nel mio script. –

1

pandas non è uno strumento da utilizzare quando tutto quello che vuoi è quello di creare un singolo file CSV, si può semplicemente scrivere ogni csv in un nuovo file, come si va:

import glob 

with open("out.csv","w") as out: 
    for fle in glob.glob("*.csv"): 
     with open(fle) as f: 
      out.writelines(f) 

O con la lib csv se si preferisce:

import glob 
import csv 

with open("out.csv", "w") as out: 
    wr = csv.writer(out) 
    for fle in glob.glob("*.csv"): 
     with open(fle) as f: 
      wr.writerows(csv.reader(f)) 

Creazione di un grande dataframe solo scrivere finalmente su disco non fa senso reale, inoltre, se si ha un sacco di file di grandi dimensioni non può essere ancora possibile.

+0

Capito. grazie per avermi aiutato a capire il concetto. I dataframes sono nuovi per me. –

+0

Non preoccuparti, i panda sono un ottimo strumento se vuoi veramente fare un calcolo sui dati, non è lo strumento da utilizzare per concatenare alcuni file in uno –

Problemi correlati