2015-09-07 9 views
6

मैं एकाधिक पांडस डेटाफ्रेम को जोड़ने की कोशिश कर रहा हूं, जिनमें से कुछ बहु-अनुक्रमण का उपयोग करते हैं और अन्य एकल सूचकांक का उपयोग करते हैं।सिंगल और मल्टीइंडेक्स पेंडस डेटाफ्रेम को कैसे गठबंधन करें

> level_dict = {} 
> level_dict[('level 1','a','h')] = [1,2,3] 
> level_dict[('level 1','b','j')] = [5,6,7] 
> level_dict[('level 2','c','k')] = [10, 11, 12] 
> level_dict[('level 2','d','l')] = [20, 21, 22] 
> df2 = pd.DataFrame(level_dict) 
> df2 

    level 1 level 2  
     a b  c d 
     h j  k l 
0  1 5  10 20 
1  2 6  11 21 
2  3 7  12 22 

अब मैं दो dataframes श्रेणीबद्ध करना चाहते हैं: उदाहरण के लिए, के निम्नलिखित एकल अनुक्रमित dataframe पर विचार करते हैं:

> import pandas as pd 
> df1 = pd.DataFrame({'single': [10,11,12]}) 
> df1 

    single 
0  10 
1  11 
2  12 

एक multiindex dataframe के साथ। जब मैं concat इस्तेमाल करने की कोशिश यह multiindex सपाट इस प्रकार है:

> df3 = pd.concat([df2,df1], axis=1) 
> df3 

    (level 1, a, h) (level 1, b, j) (level 2, c, k) (level 2, d, l)  single 
0    1    5    10    20   10 
1    2    6    11    21   11 
2    3    7    12    22   12 

मैं multiindex dataframe df2 करने के लिए एक एकल स्तंभ संलग्न, तो इसके बजाय इस प्रकार है:

> df2['single'] = [10,11,12] 
> df2 

    level 1 level 2  single 
     a b  c d  
     h j  k l  
0  1 5  10 20  10 
1  2 6  11 21  11 
2  3 7  12 22  12 

मैं कैसे बजाय से इस dataframe उत्पन्न कर सकते हैं df1 और df2concat, merge, या join के साथ?

उत्तर

2

मुझे नहीं लगता कि आप एकल इंडेक्स को MultiIndex में परिवर्तित करने से बच सकते हैं। यह शायद सबसे आसान तरीका है, आप शामिल होने के बाद भी परिवर्तित कर सकते हैं।

In [48]: df1.columns = pd.MultiIndex.from_tuples([(c, '', '') for c in df1]) 

In [49]: pd.concat([df2, df1], axis=1) 
Out[49]: 
    level 1 level 2  single 
     a b  c d  
     h j  k l  
0  1 5  10 20  10 
1  2 6  11 21  11 
2  3 7  12 22  12 
+0

धन्यवाद @chrisb! मैंने एक सरल और अधिक सामान्य दृष्टिकोण की उम्मीद की थी, लेकिन मैं यहां आपके समाधान के साथ एक समाधान तैयार करने में सक्षम था जो मेरी आवश्यकताओं को पूरा करता है – wbinventor

1

आप को केवल एक कॉलम जोड़ रहे हैं तो आप अनिवार्य रूप से एक श्रृंखला के रूप DF1 पहुंच सकता है:

df2[df1.columns[0]] = df1.iloc[:, 0] 
df2 
    level 1 level 2  single 
     a b  c d 
     h j  k l 
0  1 5  10 20  10 
1  2 6  11 21  11 
2  3 7  12 22  12 

तुम सिर्फ पहली जगह में एक श्रृंखला बना दिया है सकता है यह एक छोटे आसान होगा पढ़ें। यह आदेश वही काम करेगा:

ser1 = df1.iloc[:, 0] # make df1's column into a series 
df2[ser1.name] = ser1 
संबंधित मुद्दे