2014-04-25 39 views
6

Thao tác mà tôi muốn thực hiện tương tự như sáp nhập. Ví dụ: với sự hợp nhất inner, chúng tôi nhận được khung dữ liệu chứa các hàng hiện diện trong khung dữ liệu thứ nhất VÀ thứ hai. Với sự hợp nhất outer, chúng tôi nhận được một khung dữ liệu có mặt EITHER trong OR đầu tiên trong khung dữ liệu thứ hai.Làm thế nào để trừ các hàng của một khung dữ liệu gấu trúc từ một khung dữ liệu khác?

Điều tôi cần là khung dữ liệu chứa các hàng có trong khung dữ liệu đầu tiên VÀ KHÔNG có trong hàng thứ hai? Có cách nào nhanh chóng và thanh lịch để làm điều đó không?

+0

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

+0

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

+0

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à' ~ ' –

Trả lời

6

Làm thế nào về một cái gì đó như sau?

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 

print df2 

    Team Year foo 
0 Pacers 2003 12 
1 Heat 2004 6 
2 Nets 1988 6 

Chừng nào có một tổ chức phi chính thường được đặt tên cột, bạn có thể cho thêm vào sufffexes làm việc (nếu không có cột chung không quan trọng thì bạn có thể tạo một để sử dụng tạm thời .. . df1['common'] = 1df2['common'] = 1):

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 

Hoặc bạn có thể sử dụng isin nhưng bạn sẽ phải tạo ra một chìa khóa duy nhất:

df1['key'] = df1['Team'] + df1['Year'].astype(str) 
df2['key'] = df1['Team'] + df2['Year'].astype(str) 
print df1[~df1.key.isin(df2.key)] 

    Team Year foo   key 
0 Hawks 2001 5 Hawks2001 
2 Nets 1987 3 Nets1987 
4 Nets 2001 8 Nets2001 
5 Nets 2000 10 Nets2000 
6 Heat 2004 6 Heat2004 
7 Pacers 2003 12 Pacers2003 
4

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 
+0

Tuyệt vời, điều này làm việc tốt cho tôi. – Dirk

3

xem xét sau:

  1. df_one là DataFrame đầu tiên
  2. df_two là DataFrame thứ hai

Có mặt tại Đầu tiên DataFrameKhông có trong Second DataFrame

Giải pháp: bởi Index df = df_one[~df_one.index.isin(df_two.index)]

index có thể được thay thế bằng cần cột khi mà bạn muốn làm loại trừ. Trong ví dụ trên, tôi đã sử dụng chỉ mục làm tham chiếu giữa cả hai khung dữ liệu

Ngoài ra, bạn cũng có thể sử dụng truy vấn phức tạp hơn bằng cách sử dụng gấu trúc boolean.Series để giải quyết cho ở trên.

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