|
6 | 6 | from warnings import warn
|
7 | 7 | import numpy as np
|
8 | 8 |
|
| 9 | +from pandas import compat, lib, _np_version_under1p8 |
9 | 10 | import pandas.core.common as com
|
10 | 11 | import pandas.algos as algos
|
11 | 12 | import pandas.hashtable as htable
|
@@ -66,6 +67,54 @@ def unique(values):
|
66 | 67 | return _hashtable_algo(f, values.dtype)
|
67 | 68 |
|
68 | 69 |
|
| 70 | +def isin(comps, values): |
| 71 | + """ |
| 72 | + Compute the isin boolean array |
| 73 | +
|
| 74 | + Parameters |
| 75 | + ---------- |
| 76 | + comps: array-like |
| 77 | + values: array-like |
| 78 | +
|
| 79 | + Returns |
| 80 | + ------- |
| 81 | + boolean array same length as comps |
| 82 | + """ |
| 83 | + |
| 84 | + if not com.is_list_like(comps): |
| 85 | + raise TypeError("only list-like objects are allowed to be passed" |
| 86 | + " to isin(), you passed a " |
| 87 | + "[{0}]".format(type(comps).__name__)) |
| 88 | + comps = np.asarray(comps) |
| 89 | + if not com.is_list_like(values): |
| 90 | + raise TypeError("only list-like objects are allowed to be passed" |
| 91 | + " to isin(), you passed a " |
| 92 | + "[{0}]".format(type(values).__name__)) |
| 93 | + |
| 94 | + # GH11232 |
| 95 | + # work-around for numpy < 1.8 and comparisions on py3 |
| 96 | + # faster for larger cases to use np.in1d |
| 97 | + if (_np_version_under1p8 and compat.PY3) or len(comps) > 1000000: |
| 98 | + f = lambda x, y: np.in1d(x,np.asarray(list(y))) |
| 99 | + else: |
| 100 | + f = lambda x, y: lib.ismember_int64(x,set(y)) |
| 101 | + |
| 102 | + # may need i8 conversion for proper membership testing |
| 103 | + if com.is_datetime64_dtype(comps): |
| 104 | + from pandas.tseries.tools import to_datetime |
| 105 | + values = to_datetime(values)._values.view('i8') |
| 106 | + comps = comps.view('i8') |
| 107 | + elif com.is_timedelta64_dtype(comps): |
| 108 | + from pandas.tseries.timedeltas import to_timedelta |
| 109 | + values = to_timedelta(values)._values.view('i8') |
| 110 | + comps = comps.view('i8') |
| 111 | + elif com.is_int64_dtype(comps): |
| 112 | + pass |
| 113 | + else: |
| 114 | + f = lambda x, y: lib.ismember(x, set(values)) |
| 115 | + |
| 116 | + return f(comps, values) |
| 117 | + |
69 | 118 | def _hashtable_algo(f, dtype, return_dtype=None):
|
70 | 119 | """
|
71 | 120 | f(HashTable, type_caster) -> result
|
|
0 commit comments