2016-05-06 11 views
9

Il metodo to_csv dei panda non mantiene l'ordine delle colonne. Seleziona in ordine alfabetico le colonne in CSV. Questo è un bug ed è stato segnalato e dovrebbe essere corretto nella versione 0.11.0. Ho 0.18.0.Conservazione dell'ordine delle colonne nel metodo pdsas to_csv

import pandas as pd 
df = pd.DataFrame({'V_pod_error' : [a], 
        'V_pod_used' : [b], 
        'U_sol_type' : [c] 
           ... 
           ... and so on upto 50 columns } 

pd.to_csv(df) 

Excel ordine:

0 U_sol type   V_pod_error  V_pod_used  ... 
1 

Quello che voglio è l'ordine nel dizionario:

0 V_pod_error  V_pod_used   U_sol type  ... 
1 

Ho un gran numero di colonne e nomi. Non posso farlo manualmente o scrivere l'ordine delle colonne. C'è stata la stessa identica domanda nel 2013 here. E non sembra che ci sia un aggiornamento! Vorrei chiedere alla comunità di darmi una mano! Questo è veramente problematico.

+0

Sì, sto costruendo il frame di dati in un ciclo con i comandi precedenti. Verificherà il comando ordinato. Grazie. Il fatto è che continuavo ad aggiornare in modo rapido e sporco come e quando avevo bisogno di cose. Ora lavorarci è davvero difficile. Per aggiungere una colonna alla fine, prefisso il nome della colonna con 'z' (veloce e sporco). Qualche altro suggerimento di semplici manipolazioni al mio codice esistente per ottenere l'output desiderato come definito? –

risposta

6

Provare la seguente soluzione. Anche io ho affrontato lo stesso problema. Ho risolto come segue:

import pandas as pd 
df = pd.DataFrame({'V_pod_error' : [a], 
        'V_pod_used' : [b], 
        'U_sol_type' : [c] 
           ... 
           ... and so on upto 50 columns } 

column_order = ['V_pod_error', 'V_pod_used', 'U_sol_type',.....# upto 50 column names] 

df_to_save[column_order].to_csv(df) 
8

Penso che il problema sia nel costruttore DataFrame, perché è necessario aggiungere il parametro columns per l'ordinazione personalizzata di colonne. Se non si impostano le colonne dei parametri, le colonne vengono ordinate alfanumeriche.

import pandas as pd 
df = pd.DataFrame({'V_pod_error' : [0,2], 
        'V_pod_used' : [6,4], 
        'U_sol_type' : [7,8]}) 
print df 
    U_sol_type V_pod_error V_pod_used 
0   7   0   6 
1   8   2   4 

print df.to_csv() 
,U_sol_type,V_pod_error,V_pod_used 
0,7,0,6 
1,8,2,4 


df1 = pd.DataFrame({'V_pod_error' : [0,2], 
        'V_pod_used' : [6,4], 
        'U_sol_type' : [7,8]}, 
        columns=['V_pod_error','V_pod_used','U_sol_type']) 

print df1 
    V_pod_error V_pod_used U_sol_type 
0   0   6   7 
1   2   4   8 

print df1.to_csv() 
,V_pod_error,V_pod_used,U_sol_type 
0,0,6,7 
1,2,4,8 

EDIT:

Un'altra soluzione è impostato ordine di colonna sottoinsieme prima scrittura to_csv (grazie Mathias711):

import pandas as pd 
df = pd.DataFrame({'V_pod_error' : [0,2], 
        'V_pod_used' : [6,4], 
        'U_sol_type' : [7,8]}) 
print df 
    U_sol_type V_pod_error V_pod_used 
0   7   0   6 
1   8   2   4 

df = df[['V_pod_error','V_pod_used','U_sol_type']] 
print df 

    V_pod_error V_pod_used U_sol_type 
0   0   6   7 
1   2   4   8 

Edit1: Forse aiutare prima convertire dict-OrderedDict e quindi creare DataFrame :

import collections 
import pandas as pd 


d = {'V_pod_error' : [0,2],'V_pod_used' : [6,4], 'U_sol_type' : [7,8]} 
print d 
{'V_pod_error': [0, 2], 'V_pod_used': [6, 4], 'U_sol_type': [7, 8]} 

print pd.DataFrame(d) 
    U_sol_type V_pod_error V_pod_used 
0   7   0   6 
1   8   2   4 

d1 = collections.OrderedDict(d) 
print d1 
OrderedDict([('V_pod_error', [0, 2]), ('V_pod_used', [6, 4]), ('U_sol_type', [7, 8])]) 

print pd.DataFrame(d1) 
    V_pod_error V_pod_used U_sol_type 
0   0   6   7 
1   2   4   8 
+0

Può anche aiutare a chiamare 'df = df [[columns]]' prima di 'df.to_csv()'? Normalmente questo cambierà l'ordine delle tue colonne – Mathias711

+0

Sì, questa è un'altra opzione. Grazie. Lo aggiungo per rispondere. – jezrael

+0

@jexrael Grazie per la tua risposta immediata. Ma non sono sicuro che siamo sulla stessa pagina. Capisco che dobbiamo farlo manualmente. Ma non voglio farlo manualmente scrivendo la struttura della colonna perché ho troppe colonne. Voglio che la struttura delle colonne del dataframe sia preservata. Voglio che ciò che è nel frame dati venga visualizzato nel CSV senza problemi. –

Problemi correlati