2013-03-27 45 views

Odpowiedz

15

Wydaje się, że błąd w aktualnej wersji Pandy ('0.11.0'), który oznacza, że ​​odpowiedź Mattiego Johna nie zadziała. Jeśli określisz kolumny do zapisywania do pliku, zostaną one zapisane w kolejności alfabetycznej, ale po prostu ponownie oznaczone etykietą zgodnie z listą w cols. Na przykład, ten kod:

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"]) 

wyniki w tym (błędnej) Wyjście:

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

Można sprawdzić, która wersja pandy zostały zainstalowane przez wykonanie:

pandas.version.version 

Dokumentacja to_csv to here

Wygląda na to, że jest to znany błąd i zostanie rozwiązany w kolejnej wersji (0.11.1):

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

UPDATE: Nadal nie została nowa wersja pandy, ale istnieje obejście opisane tutaj, który nie wymaga korzystania inna wersja pandy:

github.com/pydata/pandas/issues/3454

Więc zmianie ostatniego wiersza w bloku kodu powyżej do następujących będzie działać poprawnie:

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

UPDATE wydaje się, że argument "cols" został przemianowany na "columns", a argument "engine" jest przestarzały (nie jest już dostępny) w najnowszych wersjach pandy. Ten błąd został naprawiony w wersji 0.19.0.

+0

Próbowanie tego rozwiązania z najnowszymi pandami (0.19.2) daje: 'TypeError: to_csv() dostał nieoczekiwany argument słowa kluczowego 'cols'' czy API się zmienił? – arielf

+0

Uważa się, że ta opcja została uznana za przestarzałą, ponieważ nie jest już potrzebna. – CnrL

+7

Wygląda na to, że nazwa została zmieniona na 'columns'. Zmiana 'cols' na' kolumny' działa teraz dla mnie. – arielf

11

Kolejność kolumn powinna być ogólnie zachowana podczas czytania, a następnie zapisywania pliku CSV, ale jeśli z jakiegoś powodu nie są one w żądanej kolejności, można użyć argumentu ze słowem kluczowym columns w to_csv.

Na przykład, jeśli masz CSV z kolumn A, B, C, D:

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

Innym rozwiązaniem jest to zrobić:

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

To było jedyne rozwiązanie, które działało dla mnie. Możesz zmniejszyć linię kodu, zmieniając kolejność i tworząc plik CSV w jednym kroku. – Mtap1

Powiązane problemy