2016-08-19 13 views
8

zrobić jak poniżej: kolejność kolumnKolejność kolumn w pandas.concat

data1 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]}) 
data2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]}) 
frames = [data1, data2] 
data = pd.concat(frames) 
data 


    a b 
0 2 1 
1 2 1 
2 2 1 
0 2 1 
1 2 1 
2 2 1 

Dane są w kolejności alfabetycznej. Dlaczego tak jest? i jak zachować pierwotne zamówienie?

+2

Możliwy duplikat [Jak zmienić kolejność kolumn DataFrame?] (Http://stackoverflow.com/questions/13148429/how-to-change-the-order-of-dataframe-columns) – albert

+2

Możliwy duplikat [Zachowanie kolejności kolumn - Pandy Pythona i konkluzji kolumn] (http://stackoverflow.com/questions/32533944/preserving-column-order-python-pandas-and-column-concat) – ayhan

+1

Dict nie są uporządkowane, więc dlaczego kolumny być zamówionym? – Merlin

Odpowiedz

7

Tworzysz DataFrames ze słowników. Słowniki są nieuporządkowane, co oznacza, że ​​klucze nie mają określonej kolejności. Więc

d1 = {'key_a': 'val_a', 'key_b': 'val_b'} 

i

d2 = {'key_b': 'val_b', 'key_a': 'val_a'} 

są takie same.

Oprócz tego zakładam, że pandy sortują domyślnie klawisze słownika (niestety nie znalazłem w dokumentach żadnej wskazówki, aby dowieść tego założenia) prowadząc do zachowań, które napotkali.

Podstawową motywacją będzie ułożenie/zmiana kolejności kolumn w DataFrame. Można to zrobić as follows:

import pandas as pd 

data1 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]}) 
data2 = pd.DataFrame({ 'b' : [1, 1, 1], 'a' : [2, 2, 2]}) 
frames = [data1, data2] 
data = pd.concat(frames) 

print(data) 

cols = ['b' , 'a'] 
data = data[cols] 

print(data) 
1

można tworzyć oryginalne DataFrames z OrderedDicts

from collections import OrderedDict 

odict = OrderedDict() 
odict['b'] = [1, 1, 1] 
odict['a'] = [2, 2, 2] 
data1 = pd.DataFrame(odict) 
data2 = pd.DataFrame(odict) 
frames = [data1, data2] 
data = pd.concat(frames) 
data 


    b a 
0 1 2 
1 1 2 
2 1 2 
0 1 2 
1 1 2 
2 1 2 
0
def concat_ordered_columns(frames): 
    columns_ordered = [] 
    for frame in frames: 
     columns_ordered.extend(x for x in frame.columns if x not in columns_ordered) 
    final_df = pd.concat(frames)  
    return final_df[columns_ordered]  

** Usage ** 
dfs = [df_a,df_b,df_c] 
full = conca_ordered_columns(dfs) 

To powinno działać.

Powiązane problemy