bạn có thể chạy vào e nếu cột không chỉ mục của bạn có các ô có NaN.
print df1
Team Year foo
0 Hawks 2001 5
1 Hawks 2004 4
2 Nets 1987 3
3 Nets 1988 6
4 Nets 2001 8
5 Nets 2000 10
6 Heat 2004 6
7 Pacers 2003 12
8 Problem 2112 NaN
print df2
Team Year foo
0 Pacers 2003 12
1 Heat 2004 6
2 Nets 1988 6
3 Problem 2112 NaN
new = df1.merge(df2,on=['Team','Year'],how='left')
print new[new.foo_y.isnull()]
Team Year foo_x foo_y
0 Hawks 2001 5 NaN
1 Hawks 2004 4 NaN
2 Nets 1987 3 NaN
4 Nets 2001 8 NaN
5 Nets 2000 10 NaN
6 Problem 2112 NaN NaN
Nhóm sự cố trong năm 2112 không có giá trị cho foo trong cả hai bảng. Vì vậy, việc kết nối bên trái ở đây sẽ trả về sai hàng đó, khớp với cả hai DataFrames, vì không có mặt trong DataFrame đúng.
Giải pháp:
Những gì tôi làm là để thêm một cột duy nhất cho các DataFrame bên trong và thiết lập giá trị cho tất cả các hàng. Sau đó, khi bạn tham gia, bạn có thể kiểm tra xem cột đó là NaN cho bảng bên trong để tìm các bản ghi duy nhất trong bảng bên ngoài.
df2['in_df2']='yes'
print df2
Team Year foo in_df2
0 Pacers 2003 12 yes
1 Heat 2004 6 yes
2 Nets 1988 6 yes
3 Problem 2112 NaN yes
new = df1.merge(df2,on=['Team','Year'],how='left')
print new[new.in_df2.isnull()]
Team Year foo_x foo_y in_df1 in_df2
0 Hawks 2001 5 NaN yes NaN
1 Hawks 2004 4 NaN yes NaN
2 Nets 1987 3 NaN yes NaN
4 Nets 2001 8 NaN yes NaN
5 Nets 2000 10 NaN yes NaN
NB. Hàng lỗi hiện được lọc chính xác, vì nó có giá trị cho in_df2.
Problem 2112 NaN NaN yes yes
how = 'left'? chắc chắn đó không phải là những gì bạn muốn (cho điểm số SO của bạn nó phải phức tạp hơn) –
Hợp nhất trái hoặc phải cung cấp cho tôi khung dữ liệu chứa các hàng hiện diện trong một trong các khung dữ liệu. Nhưng tôi cần một khung dữ liệu chứa các hàng có mặt trong một khung dữ liệu VÀ KHÔNG có mặt trong một khung dữ liệu khác. – Roman
Nếu nó chỉ là một khóa hợp nhất thì bạn có thể làm điều đó với 'isin' và' ~ ' –