2016-05-06 15 views
9

Metoda pand nie ma wpływu na kolejność kolumn. Decyduje się na alfabetyczne ułożenie kolumn w pliku CSV. Jest to błąd, który został zgłoszony i powinien zostać poprawiony w wersji 0.11.0. Mam 0.18.0.Zachowanie kolejności kolumn w metodzie pandy 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 zamówienie:

0 U_sol type   V_pod_error  V_pod_used  ... 
1 

Co chcę jest kolejność w słowniku:

0 V_pod_error  V_pod_used   U_sol type  ... 
1 

Mam ogromną liczbę kolumn i nazwisk. Nie mogę zrobić tego ręcznie lub napisać kolejność kolumn. W 2013 roku było dokładnie to samo pytanie: here. I nie wygląda na to, że jest aktualizacja! Chciałbym poprosić społeczność, aby mi pomogła! To naprawdę problematyczne.

+0

Tak, jestem konstruowaniu ramki danych w pętli z powyższych poleceń. Sprawdzi zamówiony dykt. Dzięki. Chodzi o to, że ciągle aktualizowałem w szybki i brudny sposób, kiedy i kiedy potrzebowałem rzeczy. Teraz praca z nim jest naprawdę trudna. Aby dodać kolumnę do końca, poprzedzam nazwę kolumny za pomocą "z" (szybkie i brudne). Jakieś inne sugestie prostych manipulacji do mojego istniejącego kodu, aby uzyskać pożądane zdefiniowane wyjście? –

Odpowiedz

6

Wypróbuj następujące rozwiązanie. Nawet ja stanąłem w obliczu tego samego problemu. Rozwiązałem to w następujący sposób:

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

Wydaje mi się, że problem występuje w konstruktorze DataFrame, ponieważ trzeba dodać parametr columns do niestandardowego porządkowania kolumn. Jeśli nie ustawisz kolumn parametrów, kolumny będą uporządkowane alfanumerycznie.

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:

Innym rozwiązaniem jest ustawiona kolejność kolumny podzbioru przed zapisem to_csv (dzięki 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: Może pomóc najpierw przekonwertować dict do OrderedDict a następnie utworzyć 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

Czy to również może wywołać 'df = df [[kolumny]] tuż przed' df.to_csv() '? Zwykle zmieni to kolejność kolumn – Mathias711

+0

Tak, jest to inna opcja. Dzięki. Dodaję to, aby odpowiedzieć. – jezrael

+0

@jexrael Dzięki za twoją natychmiastową odpowiedź. Ale nie jestem pewien, czy jesteśmy na tej samej stronie. Rozumiem, że musimy zrobić to ręcznie. Ale nie chcę tego robić ręcznie, wypisując strukturę kolumn, ponieważ mam zbyt wiele kolumn. Chcę zachować strukturę kolumny danych. Chcę, aby zawartość ramki danych pojawiła się w csv bez żadnych problemów. –