Skip to content

Commit 911fec2

Browse files
committed
BUG: fix multiindex partial slicing bug in .ix close #1352
1 parent 8aaadbe commit 911fec2

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed

RELEASE.rst

+1
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ pandas 0.8.0
168168
- Consistently set name on groupby pieces (#184)
169169
- Treat dict return values as Series in GroupBy.apply (#823)
170170
- Respect column selection for DataFrame in in GroupBy.transform (#1365)
171+
- Fix MultiIndex partial indexing bug (#1352)
171172

172173
pandas 0.7.3
173174
============

pandas/core/indexing.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,13 @@ def _getitem_lowerdim(self, tup):
168168
except TypeError:
169169
# slices are unhashable
170170
pass
171-
except Exception:
171+
except Exception, e1:
172172
if isinstance(tup[0], slice):
173173
raise IndexingError
174-
if tup[0] not in ax0: # and tup[0] not in ax0.levels[0]:
175-
raise
174+
try:
175+
loc = ax0.get_loc(tup[0])
176+
except KeyError:
177+
raise e1
176178

177179
# to avoid wasted computation
178180
# df.ix[d1:d2, 0] -> columns first (True)

pandas/tests/test_multilevel.py

+15
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,21 @@ def test_fancy_slice_partial(self):
492492
expected = self.ymd[(lev >= 1) & (lev <= 3)]
493493
assert_frame_equal(result, expected)
494494

495+
def test_getitem_partial_column_select(self):
496+
idx = MultiIndex(labels=[[0,0,0],[0,1,1],[1,0,1]],
497+
levels=[['a','b'],['x','y'],['p','q']])
498+
df = DataFrame(np.random.rand(3,2),index=idx)
499+
500+
result = df.ix[('a', 'y'), :]
501+
expected = df.ix[('a', 'y')]
502+
assert_frame_equal(result, expected)
503+
504+
result = df.ix[('a', 'y'), [1, 0]]
505+
expected = df.ix[('a', 'y')][[1, 0]]
506+
assert_frame_equal(result, expected)
507+
508+
self.assertRaises(KeyError, df.ix.__getitem__, (('a', 'foo'), :))
509+
495510
def test_sortlevel(self):
496511
df = self.frame.copy()
497512
df.index = np.arange(len(df))

0 commit comments

Comments
 (0)