2015-01-22 51 views
9

Tôi chắc chắn thiếu một cái gì đó đơn giản ở đây. Cố gắng hợp nhất hai dataframes trong gấu trúc có hầu hết các tên cột giống nhau, nhưng khung dữ liệu bên phải có một số cột bên trái không có và ngược lại.Pandas hợp nhất hai dataframes với các cột khác nhau

>df_may 

    id quantity attr_1 attr_2 
0 1  20  0  1 
1 2  23  1  1 
2 3  19  1  1 
3 4  19  0  0 

>df_jun 

    id quantity attr_1 attr_3 
0 5   8  1  0 
1 6  13  0  1 
2 7  20  1  1 
3 8  25  1  1 

Tôi đã thử tham gia với một bên ngoài tham gia:

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer") 

Nhưng đó sản lượng:

Left data columns not unique: Index([.... 

Tôi cũng đã chỉ định một cột duy nhất để tham gia vào (on = " id ", vd), nhưng trùng lặp tất cả các cột ngoại trừ" id "như attr_1_x, attr_1_y, không phải là lý tưởng. Tôi cũng đã vượt qua toàn bộ danh sách các cột (có rất nhiều) để "on":

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer", on=list(df_may.columns.values)) 

nào mang lại:

ValueError: Buffer has wrong number of dimensions (expected 1, got 2) 

tôi thiếu gì? Tôi muốn nhận được một df với tất cả các hàng được nối thêm, và attr_1, attr_2, attr_3 đông dân nơi có thể, NaN nơi chúng không hiển thị. Điều này có vẻ giống như một luồng công việc khá điển hình cho việc nén dữ liệu, nhưng tôi bị kẹt.

Xin cảm ơn trước.

+0

Tôi nghĩ rằng bạn muốn 'mayjundf = pd .DataFrame.merge (df_may, df_jun, how = "outer", on = 'id') ' – EdChum

+0

Bạn đã chỉ định" how "hai lần, yields: SyntaxError: đối số từ khóa lặp lại – economy

+0

Thực ra tôi nghĩ bạn muốn:' pd.concat ([df_may, df_jun], trục = 0, bỏ qua_index = Đúng) ' – EdChum

Trả lời

18

Tôi nghĩ rằng trong trường hợp này concat là những gì bạn muốn:

In [12]: 

pd.concat([df,df1], axis=0, ignore_index=True) 
Out[12]: 
    attr_1 attr_2 attr_3 id quantity 
0  0  1  NaN 1  20 
1  1  1  NaN 2  23 
2  1  1  NaN 3  19 
3  0  0  NaN 4  19 
4  1  NaN  0 5   8 
5  0  NaN  1 6  13 
6  1  NaN  1 7  20 
7  1  NaN  1 8  25 

bằng cách thông qua axis=0 đây bạn đang xếp chồng của df trên đầu trang của mỗi khác mà tôi tin là những gì bạn muốn sau đó tạo ra giá trị NaN mà họ đang có vắng mặt từ dfs tương ứng của họ.

+0

Gần hơn. Có hạn chế về số cột cho concat không? AssertionError: Số lượng mục quản lý phải ngang nhau với các mục khối # mục quản lý: 70, # tot_items: 71 – economy

+0

Tôi không tin như vậy Nếu bạn đang gặp vấn đề với dữ liệu thế giới thực của mình thì bạn cần đăng mẫu của dữ liệu và mã đó tái tạo vấn đề của bạn nếu không tôi không thể giúp bạn, cũng sẽ giúp nếu bạn đăng đầu ra từ cả hai dfs khi bạn có thể '.info()' trên chúng – EdChum

+0

Đó là một cái gì đó đơn giản, một paren bên trong tên cột từ một tệp định dạng đã gây ra các tên cột trùng lặp. Tôi đang đưa ra @EdChum câu trả lời như phương pháp này chắc chắn là cách dễ nhất để đạt được phụ lục. – economy

0

Tôi có vấn đề này hiện nay sử dụng bất kỳ concat, thêm hoặc sáp nhập, và tôi đã nhận xung quanh nó bằng cách thêm một cột helper đánh số liên tục và sau đó làm một phép nối ngoài

```helper=1 
for i in df1.index: 
    df1.loc[i,'helper']=helper 
    helper=helper+1 
for i in df2.index: 
    df2.loc[i,'helper']=helper 
    helper=helper+1 
df1.merge(df2,on='helper',how='outer')``` 
Các vấn đề liên quan