2016-08-19 131 views
8

我如下做:列順序在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 

數據列順序是字母表順序。爲什麼這樣? 以及如何保持原來的順序?

+2

可能重複的[如何更改DataFrame列的順序?](http://stackoverflow.com/questions/13148429/how-to-change-the-order-of-dataframe-columns) – albert

+2

可能的重複[保留列順序 - Python的熊貓和列Concat](http://stackoverflow.com/questions/32533944/preserving-column-order-python-pandas-and-column-concat) – ayhan

+1

Dict沒有排序,所以爲什麼應該列訂購? – Merlin

回答

7

您正在使用字典創建數據框。字典是無序的,這意味着密鑰沒有特定的順序。所以

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

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

是相同的。

除此之外,我假設熊貓根據默認降序排序字典的鍵(不幸的是我沒有在文檔中找到任何暗示來證明這種假設),導致您遇到的行爲。

所以基本的動機是對DataFrame中的列進行求值/重新排序。你可以這樣做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

您可以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) 

這應該創建原始DataFrames。