2013-09-23 52 views
9

我想合併兩個DataFrame,同時創建一個多層列命名方案,表示行來自哪個數據幀。例如:合併具有分層列的兩個數據框

In [98]: A=pd.DataFrame(np.arange(9.).reshape(3,3),columns=list('abc')) 
In [99]: A 
Out[99]: 
    a b c 
0 0 1 2 
1 3 4 5 
2 6 7 8 

In [100]: B=A.copy() 

如果我使用pd.merge(),然後我得到

In [104]: pd.merge(A,B,left_index=True,right_index=True) 
Out[104]: 
    a_x b_x c_x a_y b_y c_y 
0 0 1 2 0 1 2 
1 3 4 5 3 4 5 
2 6 7 8 6 7 8 

這是我期待這種說法,我想什麼(但我不知道怎麼弄!)是:

In [104]: <<one or more statements>> 
Out[104]: 
    A    B 
    a b c a b c 
0 0 1 2 0 1 2 
1 3 4 5 3 4 5 
2 6 7 8 6 7 8 

可以這樣做改變原有pd.DataFrame電話?我正在讀取.csv文件中的數據框中的數據,這可能是我的問題。

回答

4

第一種情況可以訂購任意在A,B之間(不是列,只是A或B的順序) 2nd應該保留順序

恕我直言,這是pandonic!

In [5]: concat(dict(A = A, B = B),axis=1) 
Out[5]: 
    A  B  
    a b c a b c 
0 0 1 2 0 1 2 
1 3 4 5 3 4 5 
2 6 7 8 6 7 8 

In [6]: concat([ A, B ], keys=['A','B'],axis=1) 
Out[6]: 
    A  B  
    a b c a b c 
0 0 1 2 0 1 2 
1 3 4 5 3 4 5 
2 6 7 8 6 7 8 
+0

它絕對是! –

+0

如果有人感到困惑,這個答案中的'concat'是'pd.concat()'。 – stackoverflowuser2010

5

這裏有一種方法,它的確改變了A和B:

In [10]: from itertools import cycle 

In [11]: A.columns = pd.MultiIndex.from_tuples(zip(cycle('A'), A.columns)) 

In [12]: A 
Out[12]: 
    A 
    a b c 
0 0 1 2 
1 3 4 5 
2 6 7 8 

In [13]: B.columns = pd.MultiIndex.from_tuples(zip(cycle('B'), B.columns)) 

In [14]: A.join(B) 
Out[14]: 
    A  B 
    a b c a b c 
0 0 1 2 0 1 2 
1 3 4 5 3 4 5 
2 6 7 8 6 7 8 

實際上,我認爲這將是一個很好的選擇行爲,而不是後綴...

+2

如果沒有更多pandorable *的方式來做這個ATM,那麼我是+1使它成爲一個本機關鍵字控制選項。 (看看我的廣告系列有多微妙?也許我應該在PyCon或其他東西上貼出貼紙:^) – DSM

+0

@DSM wooo,pycon!謝謝你提醒我:我有我的票! :D –

+0

@DSM你應該檢查傑夫的解決方案,好多了! –

相關問題