Skip to content

Commit abb797d

Browse files
committed
BUG: bug in xs for a Series with a multiindex (GH6258)
1 parent da82915 commit abb797d

File tree

4 files changed

+18
-13
lines changed

4 files changed

+18
-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`)
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

+8
Original file line numberDiff line numberDiff line change
@@ -951,6 +951,14 @@ 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+
954962
def test_ix_general(self):
955963

956964
# ix general issues

0 commit comments

Comments
 (0)