diff --git a/python/cudf/cudf/core/column/column.py b/python/cudf/cudf/core/column/column.py index b4f65693d85..cd537dbe9d3 100644 --- a/python/cudf/cudf/core/column/column.py +++ b/python/cudf/cudf/core/column/column.py @@ -916,13 +916,11 @@ def _obtain_isin_result(self, rhs: ColumnBase) -> ColumnBase: Helper function for `isin` which merges `self` & `rhs` to determine what values of `rhs` exist in `self`. """ - ldf = cudf.DataFrame({"x": self, "orig_order": arange(len(self))}) - rdf = cudf.DataFrame( - {"x": rhs, "bool": full(len(rhs), True, dtype="bool")} - ) - res = ldf.merge(rdf, on="x", how="left").sort_values(by="orig_order") - res = res.drop_duplicates(subset="orig_order", ignore_index=True) - return res._data["bool"].fillna(False) + # We've already matched dtypes by now + result = libcudf.search.contains(rhs, self) + if result.null_count: + return result.fillna(False) + return result def as_mask(self) -> Buffer: """Convert booleans to bitmask diff --git a/python/cudf/cudf/core/multiindex.py b/python/cudf/cudf/core/multiindex.py index d0c8a513686..fdf806d5a02 100644 --- a/python/cudf/cudf/core/multiindex.py +++ b/python/cudf/cudf/core/multiindex.py @@ -746,7 +746,7 @@ def isin(self, values, level=None): ) self_df = self.to_frame(index=False).reset_index() values_df = values_idx.to_frame(index=False) - idx = self_df.merge(values_df)._data["index"] + idx = self_df.merge(values_df, how="leftsemi")._data["index"] res = cudf.core.column.full(size=len(self), fill_value=False) res[idx] = True result = res.values