2014-10-08 14 views
7

Có thể thực hiện việc tham gia trái trong gấu trúc mà chỉ chọn trận đấu đầu tiên ở bên phải không? Ví dụ:Có thể thực hiện việc tham gia trái trong gấu trúc mà chỉ chọn trận đấu đầu tiên ở bên phải không?

left   = pd.DataFrame() 
left['age']  = [11, 12] 
right   = pd.DataFrame() 
right['age'] = [10, 11, 11] 
right['salary'] = [ 100, 150, 200 ] 
left.merge(right, how='left', on='age') 

Returns

age salary 
0 11  100 
1 11  200 
2 12  NaN 

Nhưng những gì tôi muốn là để bảo tồn số hàng của bên trái, bởi chỉ đơn thuần là tham gia trận đấu đầu tiên. Đó là:

age salary 
0 11  100 
2 12  NaN 

Vì vậy, tôi đã sử dụng

left.merge(right.drop_duplicates(['age']), how='left', on='age') 

nhưng tôi tin rằng điều này làm cho một bản sao đầy đủ quyền. Và nó có mùi buồn cười.

Có cách nào thanh lịch hơn không?

+1

Việc này sẽ đơn giản để thêm làm tùy chọn để 'hợp nhất'', nhưng hiện không được triển khai. – Jeff

+0

Cảm ơn Jeff. Tôi sẽ yêu cầu nó. Sẽ để lại câu hỏi ở đây trong trường hợp ai đó có thể chỉ ra cho tôi làm thế nào để tránh các bản sao (hoặc tác dụng phụ) trong thời gian này. – Quant

Trả lời

1

Có, bạn có thể sử dụng nhóm để xóa các dòng trùng lặp của mình. Làm mọi thứ bạn đã làm để xác định trái và phải. Bây giờ, tôi xác định một dataframe mới trên dòng cuối cùng của bạn:

left2=left.merge(right, how='left', on='age') 
df= left2.groupby(['age'])['salary'].first().reset_index() 
df 

Lúc đầu, tôi sử dụng một .min(), mà sẽ cung cấp cho bạn mức lương tối thiểu ở mỗi độ tuổi, như vậy:

df= left2.groupby(['age'])['salary'].min().reset_index() 

Nhưng bạn đã đặc biệt hỏi về trận đấu đầu tiên. Để làm như vậy bạn sử dụng tùy chọn .first(). Lưu ý: .reset_index() ở cuối, chỉ định dạng lại đầu ra của groupby thành một khung dữ liệu một lần nữa.

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