diff --git a/pandas/core/frame.py b/pandas/core/frame.py index bd220a008c9e8..d389d8c93cd2c 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -2025,6 +2025,11 @@ def xs(self, key, axis=0, level=None, copy=True): indexer = tuple(indexer) else: indexer = loc + lev_num = labels._get_level_number(level) + lev = labels.levels[lev_num] + is_int_type = com.is_integer_dtype(lev) + if is_int_type: + indexer = self.index[loc] result = self.ix[indexer] setattr(result, result._get_axis_name(axis), new_ax) diff --git a/pandas/tests/test_multilevel.py b/pandas/tests/test_multilevel.py index 34872ea572f81..acd1e3251e64c 100644 --- a/pandas/tests/test_multilevel.py +++ b/pandas/tests/test_multilevel.py @@ -359,6 +359,18 @@ def test_xs_level_multiple(self): expected = df.xs('a').xs(4, level='four') assert_frame_equal(result, expected) + #GH2107 + import itertools + from string import letters + dates = range(20111201, 20111205) + ids = letters[:5] + idx = MultiIndex.from_tuples([x for x in itertools.product(dates, ids)]) + idx.names = ['date', 'secid'] + df = DataFrame(np.random.randn(len(idx), 3), idx, ['X', 'Y', 'Z']) + rs = df.xs(20111201, level='date') + xp = df.ix[20111201, :] + assert_frame_equal(rs, xp) + def test_xs_level0(self): from pandas import read_table from StringIO import StringIO