2015-12-04 28 views
50

Sto leggendo un file CSV in pandas. Questo file csv constists di quattro colonne e alcune righe, ma non ha una riga di intestazione, che voglio aggiungere. Ho cercato il seguente:Come aggiungere una riga di intestazione a un panda DataFrame

Cov = pd.read_csv("path/to/file.txt", sep='\t') 
Frame=pd.DataFrame([Cov], columns = ["Sequence", "Start", "End", "Coverage"]) 
Frame.to_csv("path/to/file.txt", sep='\t') 

Ma quando applico il codice, ottengo il seguente errore:

ValueError: Shape of passed values is (1, 1), indices imply (4, 1) 

Cosa significa esattamente l'errore? E quale sarebbe un modo pulito in python per aggiungere una riga di intestazione al mio file csv/pandas df?

risposta

84

È possibile utilizzare names direttamente nel read_csv

names : array-like, default None List of column names to use. If file contains no header row, then you should explicitly pass header=None

Cov = pd.read_csv("path/to/file.txt", sep='\t', 
        names = ["Sequence", "Start", "End", "Coverage"]) 

La riga sottostante non funziona come previsto. Cov è già un dataframe, assumendo che abbia davvero 4 colonne quando viene letto dal file.

Frame=pd.DataFrame([Cov], columns = ["Sequence", "Start", "End", "Coverage"]) 
+4

Riderete. In realtà ho provato questo, ma non ero a conoscenza del fatto che devi mettere le parentesi quadre intorno ai nomi. Che è logicamente in retrospettiva. Grazie! –

+0

Nessun problema, abbiamo fatto tutti quegli errori stupidi. Sono colpevole anche di loro. – Leb

41

In alternativa si poteva leggere che si CSV con header=None e poi aggiunge con df.columns:

Cov = pd.read_csv("path/to/file.txt", sep='\t', header=None) 
Cov.columns = ["Sequence", "Start", "End", "Coverage"] 
1
col_Names=["Sequence", "Start", "End", "Coverage"] 
my_CSV_File= pd.read_csv("yourCSVFile.csv",names=col_Names) 

aver fatto questo, basta controllare con [Beh, ovviamente lo so, u so che. Ma ancora ...

my_CSV_File.head() 

Speranza che aiuta ... Cin cin

+0

Si prega di formattare il codice con il tasto '{}'. L'indentazione conta. – MrT

0

per risolvere il tuo codice è possibile semplicemente cambiare [Cov]-Cov.values, il primo parametro di pd.DataFrame diventerà una multi-dimensionale numpy array:

Cov = pd.read_csv("path/to/file.txt", sep='\t') 
Frame=pd.DataFrame(Cov.values, columns = ["Sequence", "Start", "End", "Coverage"]) 
Frame.to_csv("path/to/file.txt", sep='\t') 

Ma la soluzione più intelligente è ancora usare pd.read_excel con header=None e names=columns_list.