Skip to content

Commit ad26bb5

Browse files
committed
Merge pull request #6259 from jreback/xs_bug
BUG: bug in xs for a Series with a multiindex (GH6258)
2 parents da82915 + 43c36c1 commit ad26bb5

File tree

4 files changed

+28
-13
lines changed

4 files changed

+28
-13
lines changed

doc/source/release.rst

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ Bug Fixes
7474
- Bug in version string gen. for dev versions with shallow clones / install from tarball (:issue:`6127`)
7575
- Inconsistent tz parsing Timestamp/to_datetime for current year (:issue:`5958`)
7676
- Indexing bugs with reordered indexes (:issue:`6252`, :issue:`6254`)
77+
- Bug in ``.xs`` with a Series multiindex (:issue:`6258`, :issue:`5684`)
7778

7879
pandas 0.13.1
7980
-------------

pandas/core/generic.py

+8-12
Original file line numberDiff line numberDiff line change
@@ -1262,21 +1262,17 @@ def xs(self, key, axis=0, level=None, copy=True, drop_level=True):
12621262
if not copy and not isinstance(loc, slice):
12631263
raise ValueError('Cannot retrieve view (copy=False)')
12641264

1265-
# level = 0
1266-
loc_is_slice = isinstance(loc, slice)
1267-
if not loc_is_slice:
1268-
indexer = [slice(None)] * self.ndim
1269-
indexer[axis] = loc
1270-
indexer = tuple(indexer)
1271-
else:
1272-
indexer = loc
1265+
# convert to a label indexer if needed
1266+
if isinstance(loc, slice):
12731267
lev_num = labels._get_level_number(level)
12741268
if labels.levels[lev_num].inferred_type == 'integer':
1275-
indexer = self.index[loc]
1269+
loc = labels[loc]
1270+
1271+
# create the tuple of the indexer
1272+
indexer = [slice(None)] * self.ndim
1273+
indexer[axis] = loc
1274+
indexer = tuple(indexer)
12761275

1277-
# select on the correct axis
1278-
if axis == 1 and loc_is_slice:
1279-
indexer = slice(None), indexer
12801276
result = self.ix[indexer]
12811277
setattr(result, result._get_axis_name(axis), new_ax)
12821278
return result

pandas/core/index.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3236,7 +3236,7 @@ def _get_level_indexer(self, key, level=0):
32363236
labels = self.labels[level]
32373237

32383238
if level > 0 or self.lexsort_depth == 0:
3239-
return labels == loc
3239+
return np.array(labels == loc,dtype=bool)
32403240
else:
32413241
# sorted, so can return slice object -> view
32423242
i = labels.searchsorted(loc, side='left')

pandas/tests/test_indexing.py

+18
Original file line numberDiff line numberDiff line change
@@ -951,6 +951,24 @@ def test_series_getitem_multiindex(self):
951951
expected = Series([2,3],index=[1,2])
952952
assert_series_equal(result,expected)
953953

954+
# GH6258
955+
s = Series([1,3,4,1,3,4],
956+
index=MultiIndex.from_product([list('AB'),
957+
list(date_range('20130903',periods=3))]))
958+
result = s.xs('20130903',level=1)
959+
expected = Series([1,1],index=list('AB'))
960+
assert_series_equal(result,expected)
961+
962+
# GH5684
963+
idx = MultiIndex.from_tuples([('a', 'one'), ('a', 'two'),
964+
('b', 'one'), ('b', 'two')])
965+
s = Series([1, 2, 3, 4], index=idx)
966+
s.index.set_names(['L1', 'L2'], inplace=True)
967+
result = s.xs('one', level='L2')
968+
expected = Series([1, 3], index=['a', 'b'])
969+
expected.index.set_names(['L1'], inplace=True)
970+
assert_series_equal(result, expected)
971+
954972
def test_ix_general(self):
955973

956974
# ix general issues

0 commit comments

Comments
 (0)