Skip to content

Commit b8e7a35

Browse files
committed
BUG: handle lists too in DataFrame.xs when partially selecting data from DataFrame. close #1796
1 parent 684e9dd commit b8e7a35

File tree

3 files changed

+23
-0
lines changed

3 files changed

+23
-0
lines changed

RELEASE.rst

+2
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,8 @@ pandas 0.9.0
197197
- Set index names in DataFrame.from_records (#1744)
198198
- Fix time series indexing error with duplicates, under and over hash table
199199
size cutoff (#1821)
200+
- Handle list keys in addition to tuples in DataFrame.xs when
201+
partial-indexing a hierarchically-indexed DataFrame (#1796)
200202

201203
pandas 0.8.1
202204
============

pandas/core/index.py

+5
Original file line numberDiff line numberDiff line change
@@ -2081,7 +2081,12 @@ def _drop_levels(indexer, levels):
20812081

20822082
level = self._get_level_number(level)
20832083

2084+
# kludge for #1796
2085+
if isinstance(key, list):
2086+
key = tuple(key)
2087+
20842088
if isinstance(key, tuple) and level == 0:
2089+
20852090
try:
20862091
if key in self.levels[0]:
20872092
indexer = self._get_level_indexer(key, level=level)

pandas/tests/test_multilevel.py

+16
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,22 @@ def test_xs_partial(self):
312312
assert_frame_equal(result, expected)
313313
assert_frame_equal(result, result2)
314314

315+
result = self.ymd.xs((2000, 4))
316+
expected = self.ymd.ix[2000, 4]
317+
assert_frame_equal(result, expected)
318+
319+
# ex from #1796
320+
index = MultiIndex(levels=[['foo', 'bar'], ['one', 'two'], [-1, 1]],
321+
labels=[[0, 0, 0, 0, 1, 1, 1, 1],
322+
[0, 0, 1, 1, 0, 0, 1, 1],
323+
[0, 1, 0, 1, 0, 1, 0, 1]])
324+
df = DataFrame(np.random.randn(8, 4), index=index,
325+
columns=list('abcd'))
326+
327+
result = df.xs(['foo', 'one'])
328+
expected = df.ix['foo', 'one']
329+
assert_frame_equal(result, expected)
330+
315331
def test_xs_level(self):
316332
result = self.frame.xs('two', level='second')
317333
expected = self.frame[self.frame.index.get_level_values(1) == 'two']

0 commit comments

Comments
 (0)