2015-11-19 8 views
13

Voglio aggiungere (unire) tutti i file csv in una cartella usando i panda di Python.Perché l'ordine delle colonne cambia mentre si aggiungono i datafram dei panda?

Per esempio: Say cartella è due file csv test1.csv e test2.csv come segue:

A_Id P_Id CN1   CN2   CN3 
AAA  111  702   709   740 
BBB  222  1727  1734  1778 

e

A_Id P_Id CN1   CN2   CN3 
CCC  333  710  750   750 
DDD  444  180  734   778 

Quindi lo script Python che ho scritto è stato il seguente:

#!/usr/bin/python 
import pandas as pd 
import glob 

all_data = pd.DataFrame() 
for f in glob.glob("testfolder/*.csv"): 
    df = pd.read_csv(f) 
    all_data = all_data.append(df) 

all_data.to_csv('testfolder/combined.csv') 

Anche se il combined.csv sembra avere tutto il file allegati, essa appare come segue:

 CN1  CN2   CN3 A_Id P_Id 
    0 710  750   750  CCC  333 
    1 180  734   778  DDD  444  
    0 702  709   740  AAA  111 
    1 1727  1734  1778 BBB  222 

Dove come dovrebbe apparire così:

A_ID P_Id CN1 CN2 CN2 
AAA 111 702 709 740 
BBB 222 1727 1734 1778 
CCC 333 110 356 123 
DDD 444 220 256 223 
  • Perché sono le prime due colonne spostato alla fine?
  • Perché viene aggiunto nella prima riga anziché nell'ultima riga?

Cosa mi manca? E come posso ottenere uno 0 e un 1 nella prima colonna?

P.S: Poiché si tratta di file csv di grandi dimensioni, ho pensato di utilizzare i panda.

+1

Quale versione di panda utilizza? Perché funziona bene in 0.17.0. – jezrael

+1

Penso che il problema sia con il formato di csv - prova dopo la riga 'df = pd.read_csv (f)' aggiungi 'print df.head()' per controllarlo. – jezrael

+1

E penso che tu abbia letto l'output come input 'glob.glob (" testfolder/*. Csv "):', perché l'output è scrivere nella directory di input: 'all_data.to_csv ('testfolder/combined.csv')', hai per cambiare directory a 'all_data.to_csv ('out/combined.csv')' – jezrael

risposta

0

Ho ottimizzato il codice come indicato di seguito. Commenti in linea.

#!/usr/bin/python 
import pandas as pd 
import glob 

# Grab all the csv files in the folder to a list. 
fileList = glob.glob('input_folder/*.csv') 

#Initialize an empty dataframe to grab the csv content. 
all_data = pd.DataFrame() 

#Initialize an empty list to grab the dataframes. 
dfList= [] 

for files in fileList: 
    df = pd.read_csv(files, index_col = None, header= False) 
    dfList.append(df) 

#The frames will be in reverse order i.e last read file's content in the begining. So reverse it again 
Reversed_dfList = dfList[::-1] 
CombinedFrame = pd.concat(Reversed_dfList) 

# The "Combined.csv" file will have combination of all the files. 
CombinedFrame.to_csv('output_folder/Combined.csv', index=False) 
7

Prova questo .....

all_data = all_data.append(df)[df.columns.tolist()] 
+3

Sebbene questo codice possa rispondere alla domanda, fornire un contesto aggiuntivo sul perché e/o su come questo codice risponde alla domanda migliora il suo valore a lungo termine. Le risposte al solo codice sono scoraggiate. – Ajean

+3

Quindi questo è forse un bug di Pandas che deve essere archiviato? Ho avuto lo stesso problema. – user1761806

+1

la domanda che @kingmakerking stava chiedendo è "perché". questo non sarebbe d'aiuto se i 2 dataframe avessero colonne diverse per esempio. Posso vedere lo stesso problema anche con pd.concat – mm441

2

Ho avuto lo stesso problema ed è stato doloroso. Sono riuscito a risolverlo riorganizzando le colonne in base al dataframe di origine dopo essere stato aggiunto al dataframe finale. Si sarebbe simile a questa:

soluzione
#!/usr/bin/python 
import pandas as pd 
import glob 

all_data = pd.DataFrame() 
for f in glob.glob("testfolder/*.csv"): 
    df = pd.read_csv(f) 
    all_data = all_data.append(df) 
    all_data = all_data[df.columns] 

all_data.to_csv('testfolder/combined.csv') 

Dal momento che il problema è stato da quasi due anni fa, sto postando che ha lavorato per me per enyone altro che dovrà affrontare anche problema simile.