Skip to content

Commit c32cc6e

Browse files
committed
BUG: fix mixed-integer .ix indexing bugs. close#1799
1 parent 46ac72b commit c32cc6e

File tree

4 files changed

+51
-4
lines changed

4 files changed

+51
-4
lines changed

RELEASE.rst

+1
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ pandas 0.9.0
147147
backfill_2d
148148
- Fix resampling error with intraday times and anchored target time (like
149149
AS-DEC) (#1772)
150+
- Fix .ix indexing bugs with mixed-integer indexes (#1799)
150151

151152
pandas 0.8.1
152153
============

pandas/core/indexing.py

+11-4
Original file line numberDiff line numberDiff line change
@@ -300,8 +300,15 @@ def _reindex(keys, level=None):
300300
# asarray can be unsafe, NumPy strings are weird
301301
keyarr = _asarray_tuplesafe(key)
302302

303-
if _is_integer_dtype(keyarr) and not _is_integer_index(labels):
304-
return self.obj.take(keyarr, axis=axis)
303+
if _is_integer_dtype(keyarr):
304+
if labels.inferred_type == 'mixed-integer':
305+
indexer = labels.get_indexer(keyarr)
306+
if (indexer >= 0).all():
307+
self.obj.take(indexer, axis=axis)
308+
else:
309+
return self.obj.take(keyarr, axis=axis)
310+
elif not labels.inferred_type == 'integer':
311+
return self.obj.take(keyarr, axis=axis)
305312

306313
# this is not the most robust, but...
307314
if (isinstance(labels, MultiIndex) and
@@ -368,7 +375,7 @@ def _convert_to_indexer(self, obj, axis=0):
368375
j = labels.get_loc(stop)
369376
position_slice = False
370377
except KeyError:
371-
if ltype == 'mixed-integer':
378+
if ltype == 'mixed-integer-float':
372379
raise
373380

374381
if null_slice or position_slice:
@@ -471,7 +478,7 @@ def _get_slice_axis(self, slice_obj, axis=0):
471478
j = labels.get_loc(stop)
472479
position_slice = False
473480
except KeyError:
474-
if labels.inferred_type == 'mixed-integer':
481+
if labels.inferred_type == 'mixed-integer-float':
475482
raise
476483

477484
if null_slice or position_slice:

pandas/src/inference.pyx

+27
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ def infer_dtype(object _values):
5959
elif util.is_integer_object(val):
6060
if is_integer_array(values):
6161
return 'integer'
62+
elif is_integer_float_array(values):
63+
return 'mixed-integer-float'
6264
return 'mixed-integer'
6365
elif is_datetime(val):
6466
if is_datetime_array(values):
@@ -75,6 +77,8 @@ def infer_dtype(object _values):
7577
elif util.is_float_object(val):
7678
if is_float_array(values):
7779
return 'floating'
80+
elif is_integer_float_array(values):
81+
return 'mixed-integer-float'
7882

7983
elif util.is_bool_object(val):
8084
if is_bool_array(values):
@@ -155,6 +159,29 @@ def is_integer_array(ndarray values):
155159
else:
156160
return False
157161

162+
def is_integer_float_array(ndarray values):
163+
cdef:
164+
Py_ssize_t i, n = len(values)
165+
ndarray[object] objbuf
166+
object obj
167+
168+
if issubclass(values.dtype.type, np.integer):
169+
return True
170+
elif values.dtype == np.object_:
171+
objbuf = values
172+
173+
if n == 0:
174+
return False
175+
176+
for i in range(n):
177+
if not (util.is_integer_object(objbuf[i]) or
178+
util.is_float_object(objbuf[i])):
179+
180+
return False
181+
return True
182+
else:
183+
return False
184+
158185
def is_float_array(ndarray values):
159186
cdef:
160187
Py_ssize_t i, n = len(values)

pandas/tests/test_frame.py

+12
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,18 @@ def test_getitem_boolean_iadd(self):
163163

164164
assert_almost_equal(df.values, arr)
165165

166+
def test_getitem_ix_mixed_integer(self):
167+
df = DataFrame(np.random.randn(4, 3),
168+
index=[1, 10, 'C', 'E'], columns=[1, 2, 3])
169+
170+
result = df.ix[:-1]
171+
expected = df.ix[df.index[:-1]]
172+
assert_frame_equal(result, expected)
173+
174+
result = df.ix[[1, 10]]
175+
expected = df.ix[Index([1, 10], dtype=object)]
176+
assert_frame_equal(result, expected)
177+
166178
def test_getattr(self):
167179
tm.assert_series_equal(self.frame.A, self.frame['A'])
168180
self.assertRaises(AttributeError, getattr, self.frame,

0 commit comments

Comments
 (0)