Skip to content

Commit d5d31f1

Browse files
committed
BUG: don't coerce False/True to 0/1 in engines. close #2199
1 parent 68bde25 commit d5d31f1

File tree

4 files changed

+21
-6
lines changed

4 files changed

+21
-6
lines changed

RELEASE.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ pandas 0.9.1
9292
- Fix Series and DataFrame.diff for integer dtypes (#2087, #2174)
9393
- Fix bug when taking intersection of DatetimeIndex with empty index (#2129)
9494
- Pass through timezone information when calling DataFrame.align (#2127)
95-
95+
- Properly sort when joining on datetime64 values (#2196)
96+
- Fix indexing bug in which False/True were being coerced to 0/1 (#2199)
9697
9798
pandas 0.9.0
9899
============

pandas/core/frame.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2099,12 +2099,10 @@ def xs(self, key, axis=0, level=None, copy=True):
20992099
new_values = self._data.fast_2d_xs(loc, copy=copy)
21002100
return Series(new_values, index=self.columns,
21012101
name=self.index[loc])
2102-
else: # isinstance(loc, slice) or loc.dtype == np.bool_:
2102+
else:
21032103
result = self[loc]
21042104
result.index = new_index
21052105
return result
2106-
# else:
2107-
# return self.take(loc)
21082106

21092107
def lookup(self, row_labels, col_labels):
21102108
"""

pandas/src/engines.pyx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,11 @@ cdef class IndexEngine:
127127
if not self.unique:
128128
return self._get_loc_duplicates(val)
129129

130+
self._check_type(val)
131+
130132
try:
131133
return self.mapping.get_item(val)
132134
except TypeError:
133-
self._check_type(val)
134135
raise KeyError(val)
135136

136137
cdef inline _get_loc_duplicates(self, object val):
@@ -222,7 +223,7 @@ cdef class IndexEngine:
222223
cdef _make_hash_table(self, n):
223224
raise NotImplementedError
224225

225-
cdef inline _check_type(self, object val):
226+
cdef _check_type(self, object val):
226227
hash(val)
227228

228229
cdef inline _ensure_mapping_populated(self):
@@ -280,6 +281,11 @@ cdef class Int64Engine(IndexEngine):
280281
return _algos.backfill_int64(self._get_index_values(), other,
281282
limit=limit)
282283

284+
cdef _check_type(self, object val):
285+
hash(val)
286+
if util.is_bool_object(val):
287+
raise KeyError(val)
288+
283289
cdef _maybe_get_bool_indexer(self, object val):
284290
cdef:
285291
ndarray[uint8_t, cast=True] indexer

pandas/tests/test_frame.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,6 +1108,16 @@ def test_getitem_ix_boolean_duplicates_multiple(self):
11081108
exp = df[df[0] > 0]
11091109
assert_frame_equal(result, exp)
11101110

1111+
def test_getitem_setitem_ix_bool_keyerror(self):
1112+
# #2199
1113+
df = DataFrame({'a': [1, 2, 3]})
1114+
1115+
self.assertRaises(KeyError, df.ix.__getitem__, False)
1116+
self.assertRaises(KeyError, df.ix.__getitem__, True)
1117+
1118+
self.assertRaises(KeyError, df.ix.__setitem__, False, 0)
1119+
self.assertRaises(KeyError, df.ix.__setitem__, True, 0)
1120+
11111121
def test_getitem_list_duplicates(self):
11121122
# #1943
11131123
df = DataFrame(np.random.randn(4,4), columns=list('AABC'))

0 commit comments

Comments
 (0)