2015-01-25 31 views
24

Tôi cần ghép hai dataframes df_adf_b có số hàng bằng nhau (nRow) cái khác mà không xem xét bất kỳ khóa nào. Hàm này tương tự như cbind trong R programming language. Số cột trong mỗi khung dữ liệu có thể khác nhau.Ghép nối các hàng của hai khung dữ liệu trong gấu trúc

Khung dữ liệu kết quả sẽ có cùng số hàng nRow và số lượng cột bằng tổng số cột trong cả hai khung dữ liệu. Nói cách khác, đây là sự nối hai cột mù của hai khung dữ liệu.

import pandas as pd 
dict_data = {'Treatment': ['C', 'C', 'C'], 'Biorep': ['A', 'A', 'A'], 'Techrep': [1, 1, 1], 'AAseq': ['ELVISLIVES', 'ELVISLIVES', 'ELVISLIVES'], 'mz':[500.0, 500.5, 501.0]} 
df_a = pd.DataFrame(dict_data) 
dict_data = {'Treatment1': ['C', 'C', 'C'], 'Biorep1': ['A', 'A', 'A'], 'Techrep1': [1, 1, 1], 'AAseq1': ['ELVISLIVES', 'ELVISLIVES', 'ELVISLIVES'], 'inte1':[1100.0, 1050.0, 1010.0]} 
df_b = pd.DataFrame(dict_data) 

Trả lời

41

gọi concat và vượt qua param axis=1 để nối cột khôn ngoan:

In [5]: 

pd.concat([df_a,df_b], axis=1) 
Out[5]: 
     AAseq Biorep Techrep Treatment  mz  AAseq1 Biorep1 Techrep1 \ 
0 ELVISLIVES  A  1   C 500.0 ELVISLIVES  A   1 
1 ELVISLIVES  A  1   C 500.5 ELVISLIVES  A   1 
2 ELVISLIVES  A  1   C 501.0 ELVISLIVES  A   1 

    Treatment1 inte1 
0   C 1100 
1   C 1050 
2   C 1010 

Có một hướng dẫn hữu ích cho các phương pháp khác nhau của merging, joining and concatenating trực tuyến.

Ví dụ, như bạn không có cột đụng độ bạn có thể merge và sử dụng các chỉ số như họ có cùng số hàng:

In [6]: 

df_a.merge(df_b, left_index=True, right_index=True) 
Out[6]: 
     AAseq Biorep Techrep Treatment  mz  AAseq1 Biorep1 Techrep1 \ 
0 ELVISLIVES  A  1   C 500.0 ELVISLIVES  A   1 
1 ELVISLIVES  A  1   C 500.5 ELVISLIVES  A   1 
2 ELVISLIVES  A  1   C 501.0 ELVISLIVES  A   1 

    Treatment1 inte1 
0   C 1100 
1   C 1050 
2   C 1010 

Và vì những lý do tương tự như trên một đơn giản join làm việc quá:

In [7]: 

df_a.join(df_b) 
Out[7]: 
     AAseq Biorep Techrep Treatment  mz  AAseq1 Biorep1 Techrep1 \ 
0 ELVISLIVES  A  1   C 500.0 ELVISLIVES  A   1 
1 ELVISLIVES  A  1   C 500.5 ELVISLIVES  A   1 
2 ELVISLIVES  A  1   C 501.0 ELVISLIVES  A   1 

    Treatment1 inte1 
0   C 1100 
1   C 1050 
2   C 1010 
+3

Không chắc tại sao, trên dữ liệu thực tế của tôi, có 1000 dòng trong mỗi df, 'concat' mang lại cho tôi 2000 hàng nhưng' join' hoạt động tốt. Ví dụ dữ liệu, cả hai đều làm việc tốt tinh tế – user1140126

+1

Kiểm tra nếu bạn có bất kỳ xung đột tên cột nào bạn có thể kiểm tra điều này bằng cách thực hiện 'df_a.columns.equals (df_b.columns)' – EdChum

+1

Thực ra bạn cần kiểm tra xem các giá trị chỉ mục có phù hợp nếu chúng không ' t sau đó bạn sẽ nhận được các hàng bổ sung như bạn quan sát, bạn có thể cần phải làm 'df_b = df_b.reindex_like (df_a)' trước khi ghép nối – EdChum

0

Nhờ @EdChum tôi đã đấu tranh với cùng một vấn đề đặc biệt là khi chỉ số không khớp nhau. Đáng tiếc là trong gấu trúc hướng dẫn trường hợp này được bỏ qua (khi bạn ví dụ xóa một số hàng)

import pandas as pd 
t=pd.DataFrame() 
t['a']=[1,2,3,4] 
t=t.loc[t['a']>1] #now index starts from 1 

u=pd.DataFrame() 
u['b']=[1,2,3] #index starts from 0 

#option 1 
#keep index of t 
u.index = t.index 

#option 2 
#index of t starts from 0 
t.reset_index(drop=True, inplace=True) 

#now concat will keep number of rows 
r=pd.concat([t,u], axis=1) 
Các vấn đề liên quan