2016-08-19 7 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

संभावित डुप्लिकेट [डेटाफ्रेम कॉलम के क्रम को कैसे बदलें?] (Http://stackoverflow.com/questions/13148429/how-to-change-the-order-of-dataframe-columns) – albert

+2

संभावित डुप्लिकेट [कॉलम ऑर्डर को संरक्षित करना - पायथन पांडो और कॉलम कंसैट] (http://stackoverflow.com/questions/32533944/preserving-column-order-python-pandas-and-column-concat) – ayhan

+1

डिक्ट ऑर्डर नहीं किया गया है, तो कॉलम क्यों होना चाहिए आदेश दिया जा सकता है? – Merlin

उत्तर

7

आप शब्दकोशों से डेटाफ्रेम बना रहे हैं। शब्दकोश एक अनियंत्रित हैं जिसका अर्थ है कि चाबियों के पास एक विशिष्ट क्रम नहीं है। तो

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

और

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

ही हैं।

इसके अलावा मुझे लगता है कि पांडा डिफ़ॉल्ट रूप से उतरने वाली शब्दकोश की चाबियों को टाइप करता है (दुर्भाग्यवश मुझे उस धारणा को साबित करने के लिए दस्तावेज़ों में कोई संकेत नहीं मिला) जिससे आपके सामने आने वाले व्यवहार की ओर अग्रसर होता है।

तो मूल प्रेरणा आपके डेटाफ्रेम में कॉलम का सहारा लेना/पुन: व्यवस्थित करना होगा। आप इस 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 बना सकते हैं।

संबंधित मुद्दे