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']
và 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 & ...]
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. –