2016-05-06 17 views
9

to_csv Die Methode der pandas nicht die Reihenfolge der Spalten bewahren. Es wird ausgewählt, die Spalten in CSV alphabetisch anzuordnen. Dies ist ein Fehler und wurde gemeldet und soll in Version 0.11.0 korrigiert werden. Ich habe 0.18.0.Preserving Spaltenreihenfolge in den pandas to_csv Verfahren

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 Reihenfolge:

0 U_sol type   V_pod_error  V_pod_used  ... 
1 

Was ich will, ist, um im Wörterbuch:

0 V_pod_error  V_pod_used   U_sol type  ... 
1 

Ich habe eine große Anzahl von Spalten und Namen. Ich kann es nicht manuell machen oder schreibe die Spaltenreihenfolge aus. Es gab die gleiche Frage im Jahr 2013 here. Und es sieht nicht so aus, als ob es ein Update gibt! Ich möchte die Community bitten, mir zu helfen! Das ist wirklich problematisch.

+0

Ja, ich bin den Datenrahmen in einer Schleife mit den obigen Befehlen zu konstruieren. Wird geprüft, dict. Vielen Dank. Die Sache ist, dass ich immer auf schnelle und schmutzige Art aktualisiert habe, wann und wo ich Dinge brauchte. Jetzt damit zu arbeiten ist wirklich schwer. Um eine Spalte am Ende hinzuzufügen, gebe ich den Spaltennamen mit 'z' (schnell und schmutzig) voran. Irgendwelche anderen Vorschläge von einfachen Manipulationen zu meinem bestehenden Code, um die gewünschte wie definierte Ausgabe zu erhalten? –

Antwort

6

Versuchen Sie die folgende Lösung. Selbst ich hatte das gleiche Problem. Ich löste es wie folgt:

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

Ich denke Problem in DataFrame Konstruktor ist, da Sie Parameter columns für benutzerdefinierte Reihenfolge der Spalten hinzufügen. Wenn Sie keine Parameterspalten festlegen, werden die Spalten alphanumerisch sortiert.

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:

Eine andere Lösung, um der Spalte von Teilmenge vor Schreib to_csv (dank Mathias711) gesetzt ist:

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: Vielleicht ersten dict-OrderedDict konvertieren helfen und erstellen 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

Kann es auch helfen, 'df = df [[Spalten]]' direkt vor 'df.to_csv()' aufzurufen? Normalerweise ändert dies die Reihenfolge Ihrer Spalten – Mathias711

+0

Ja, das ist eine andere Option. Vielen Dank. Ich füge es hinzu, um zu antworten. – jezrael

+0

@jexrael Danke für Ihre sofortige Antwort. Aber ich bin mir nicht sicher, ob wir auf der gleichen Seite sind. Ich verstehe, dass wir es manuell tun müssen. Aber ich möchte es nicht manuell machen, indem ich die Spaltenstruktur schreibe, da ich zu viele Spalten habe. Ich möchte, dass die Datenrahmenspaltenstruktur erhalten bleibt. Ich möchte, was in den Datenrahmen in der CSV ohne viel Aufhebens angezeigt wird. –

Verwandte Themen