2013-09-23 47 views
9

Tôi muốn hợp nhất hai DataFrames trong khi tạo ra một lược đồ đặt tên cột đa cấp biểu thị khung dữ liệu mà các hàng đến từ đó. Ví dụ:Hợp nhất hai DataFrames với các cột phân cấp

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() 

Nếu tôi sử dụng pd.merge(), sau đó tôi nhận được

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 

Đó là những gì tôi mong đợi với tuyên bố rằng, những gì tôi muốn (nhưng tôi không biết làm thế nào để có được!) là:

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 

này có thể được thực hiện mà không cần thay đổi bản gốc pd.DataFrame cuộc gọi? Tôi đang đọc dữ liệu trong các khung dữ liệu trong tệp .csv và đó có thể là vấn đề của tôi.

Trả lời

4

trường hợp đầu tiên có thể được đặt hàng tùy ý trong số A, B (không phải các cột, chỉ theo thứ tự A hoặc B) Thứ hai nên giữ nguyên thứ tự

IMHO đây là 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

nó chắc chắn là! –

+0

Trong trường hợp bất kỳ ai nhầm lẫn, 'concat' trong câu trả lời này là' pd.concat() '. – stackoverflowuser2010

5

Dưới đây là một cách, mà không thay đổi A và 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 

Tôi thực sự nghĩ rằng đây sẽ là một hành vi lựa chọn tốt, chứ không phải là hậu tố ...

+2

Nếu không có cách nào đáng nể hơn để thực hiện ATM này, thì tôi +1 để làm cho nó trở thành tùy chọn kiểm soát từ khóa gốc. (Xem chiến dịch của tôi tinh tế như thế nào? Có lẽ tôi nên phát các nhãn dán tại PyCon hoặc một cái gì đó.: ^) – DSM

+0

@ DSM wooo, pycon! Cảm ơn vì đã nhắc tôi: Tôi có vé của tôi! : D –

+0

@ DSM bạn nên kiểm tra giải pháp của Jeff, tốt hơn nhiều! –

Các vấn đề liên quan