7

Tôi đã xem lại các bài đăng sau đây trước. Có cách nào để sử dụng DataFrame.isin() với một yếu tố xấp xỉ hoặc một giá trị khoan dung? Hay có phương pháp nào khác có thể?Tôi có thể sử dụng pandas.dataframe.isin() với tham số dung sai số không?

Filter dataframe rows if value in column is in a set list of values

use a list of values to select rows from a pandas dataframe

EX)

df = DataFrame({'A' : [5,6,3.3,4], 'B' : [1,2,3.2, 5]}) 

In : df 
Out: 
    A B 
0 5 1 
1 6 2 
2 3.3 3.2 
3 4 5 

df[df['A'].isin([3, 6], tol=.5)] 

In : df 
Out: 
    A B 
1 6 2 
2 3.3 3.2 
+0

Trong trường hợp này chính xác, bạn có thể tạo các bản sao của A & B được làm tròn đến số nguyên gần nhất sau đó sử dụng để xác định những giá trị chỉ số có giá trị trong các cột gốc. Nói cách khác, bạn có thể thực hiện các dung sai ở phía dữ liệu thay vì bên chức năng. –

Trả lời

12

Bạn có thể làm một điều tương tự với numpy's isclose:

df[np.isclose(df['A'].values[:, None], [3, 6], atol=.5).any(axis=1)] 
Out: 
    A B 
1 6.0 2.0 
2 3.3 3.2 

lợi nhuận np.isclose này:

np.isclose(df['A'].values[:, None], [3, 6], atol=.5) 
Out: 
array([[False, False], 
     [False, True], 
     [ True, False], 
     [False, False]], dtype=bool) 

Đó là một sự so sánh cặp của các yếu tố df['A'] 's và [3, 6] (đó là lý do tại sao chúng tôi cần df['A'].values[: None] - để phát sóng). Vì bạn đang tìm kiếm cho dù nó là gần với bất kỳ một trong số họ trong danh sách, chúng tôi gọi .any(axis=1) ở cuối.


Đối với nhiều cột, thay đổi lát một chút:

mask = np.isclose(df[['A', 'B']].values[:, :, None], [3, 6], atol=0.5).any(axis=(1, 2)) 
mask 
Out: array([False, True, True, False], dtype=bool) 

Bạn có thể sử dụng mặt nạ này để cắt các DataFrame (tức df[mask])


Nếu bạn muốn so sánh df['A']df['B'] (và các cột khác có thể) với các véc tơ khác nhau, bạn có thể tạo hai mặt nạ khác nhau:

mask1 = np.isclose(df['A'].values[:, None], [1, 2, 3], atol=.5).any(axis=1) 
mask2 = np.isclose(df['B'].values[:, None], [4, 5], atol=.5).any(axis=1) 
mask3 = ... 

Sau đó cắt:

df[mask1 & mask2] # or df[mask1 & mask2 & mask3 & ...] 
+2

wow! đó là thông minh! – MaxU

+0

@webmaker Khi tôi thử nó trả về một DataFrame trống vì các giá trị trong cột D nhỏ hơn 0,15 (bạn đã vượt qua 0,1 là dung sai và giá trị nhỏ nhất trong danh sách là 0,25 để nó không trả về True cho bất kỳ giá trị nào. ?) – ayhan

+1

nó là cái gì khác, tôi quản lý để khắc phục vấn đề. bây giờ tôi đang cố gắng tìm ra cách để thực hiện nhiều cột cùng một lúc. có lẽ tham gia/concatenate df2 và df3? df2 = df [np.isclose (df ['B']. giá trị [:, None], [0.939,0.874,1.0,], atol = .05) .any (trục = 1)] df3 = df [np .đóng (df ['A']. giá trị [:, Không có], [-0.12,0.0,0.12], atol = .05) .any (axis = 1)] – webmaker

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