2013-03-27 20 views
19

Gibt es eine Möglichkeit, die Reihenfolge der Spalten in einer CSV-Datei beim Lesen und Schreiben mit Python Pandas beizubehalten? In diesem CodeSpeichern der Spaltenreihenfolge in Python Pandas DataFrame

import pandas as pd 

data = pd.read_csv(filename) 
data.to_csv(filename) 

die Ausgabedateien möglicherweise anders, da die Spalten nicht beibehalten werden.

+0

Können Sie ein Beispiel Ihrer csv zur Verfügung stellen? – waitingkuo

Antwort

15

Es scheint einen Fehler in der aktuellen Version von Pandas ('0.11.0') zu sein, die bedeutet, dass Matti Johns Antwort nicht funktionieren wird. Wenn Sie Spalten zum Schreiben in eine Datei angeben, werden diese in alphabetischer Reihenfolge geschrieben, jedoch einfach entsprechend der Liste in Spalten umbenannt. Zum Beispiel dieser Code:

import pandas 
dfdict={} 
dfdict["a"]=[1,2,3,4] 
dfdict["b"]=[5,6,7,8] 
dfdict["c"]=[9,10,11,12] 
df=pandas.DataFrame(dfdict) 
df.to_csv("dfTest.txt","\t",header=True,cols=["b","a","c"]) 

Ergebnisse in dieser (falschen) Ausgabe:

b a c 
0 1 5 9 
1 2 6 10 
2 3 7 11 
3 4 8 12 

können Sie überprüfen, welche Version von Pandas Sie durch die Ausführung installiert haben:

pandas.version.version 

Dokumentation to_csv ist here

Eigentlich scheint es, dass dies ein bekannter Fehler ist und wird in einer zukünftigen Version (0.11.1) festgelegt werden:

https://github.com/pydata/pandas/issues/3489

UPDATE: hat es noch eine neue Version von Pandas nicht, aber es gibt hier beschrieben eine Abhilfe, die Verwendung nicht erforderlich eine andere Version von Pandas:

github.com/pydata/pandas/issues/3454

die letzten Zeile in dem Codeblock über die folgenden, wird also Wechsel korrekt funktionieren:

df.to_csv("dfTest.txt","\t",header=True,cols=["b","a","c"], engine='python') 

UPDATE Es scheint, dass das Argument "cols" in "columns" umbenannt wurde und dass das Argument "engine" in neueren Versionen von Pandas veraltet (nicht mehr verfügbar) ist. Dieser Fehler wurde in Version 0.19.0 behoben.

+0

Wenn man diese Lösung mit neuen Pandas (0.19.2) versucht, erhält man: 'TypeError: to_csv() hat ein unerwartetes Schlüsselwort-Argument 'cols' bekommen? Hat sich die API geändert? – arielf

+0

glaube, diese Option wurde als nicht mehr erforderlich veraltet. – CnrL

+7

Scheint wie es umbenannt wurde in 'Spalten'. Das Ändern von "Spalten" zu "Spalten" funktioniert jetzt für mich. – arielf

11

Die Spaltenreihenfolge sollte im Allgemeinen beibehalten werden, wenn Sie eine CSV-Datei lesen und dann schreiben, aber wenn sie aus irgendeinem Grund nicht in der gewünschten Reihenfolge sind, können Sie das Schlüsselwort columns in to_csv verwenden.

Zum Beispiel, wenn Sie eine csv mit Spalten a, b, c, d:

data = pd.read_csv(filename) 
data.to_csv(filename, columns=['a', 'b', 'c', 'd']) 
4

Eine andere Lösung ist, dies zu tun:

import pandas as pd 
data = pd.read_csv(filename) 
data2 = df[['A','B','C']] #put 'A' 'B' 'C' in the desired order 
data2.to_csv(filename) 
+0

Das war die einzige Lösung, die für mich funktionierte. Sie können eine Codezeile reduzieren, indem Sie die CSV in einem Schritt neu anordnen und erstellen. – Mtap1

Verwandte Themen