Skip to content

Commit 8a573af

Browse files
committed
Merge pull request #6579 from jreback/xs
BUG: Bug in .xs with a nan in level when dropped (GH6574)
2 parents 3b4d839 + f87a052 commit 8a573af

File tree

3 files changed

+23
-0
lines changed

3 files changed

+23
-0
lines changed

doc/source/release.rst

+1
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ Bug Fixes
222222
- Bug in preserving frequency across Timestamp addition/subtraction (:issue:`4547`)
223223
- Bug in indexing: empty list lookup caused ``IndexError`` exceptions (:issue:`6536`, :issue:`6551`)
224224
- Series.quantile raising on an ``object`` dtype (:issue:`6555`)
225+
- Bug in ``.xs`` with a ``nan`` in level when dropped (:issue:`6574`)
225226

226227
pandas 0.13.1
227228
-------------

pandas/core/index.py

+6
Original file line numberDiff line numberDiff line change
@@ -2947,7 +2947,13 @@ def droplevel(self, level=0):
29472947
new_names.pop(i)
29482948

29492949
if len(new_levels) == 1:
2950+
2951+
# set nan if needed
2952+
mask = new_labels[0] == -1
29502953
result = new_levels[0].take(new_labels[0])
2954+
if mask.any():
2955+
np.putmask(result, mask, np.nan)
2956+
29512957
result.name = new_names[0]
29522958
return result
29532959
else:

pandas/tests/test_multilevel.py

+16
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,22 @@ def test_xs(self):
391391
assert_series_equal(xs, xs2)
392392
assert_almost_equal(xs.values, self.frame.values[4])
393393

394+
# GH 6574
395+
# missing values in returned index should be preserrved
396+
acc = [
397+
('a','abcde',1),
398+
('b','bbcde',2),
399+
('y','yzcde',25),
400+
('z','xbcde',24),
401+
('z',None,26),
402+
('z','zbcde',25),
403+
('z','ybcde',26),
404+
]
405+
df = DataFrame(acc, columns=['a1','a2','cnt']).set_index(['a1','a2'])
406+
expected = DataFrame({ 'cnt' : [24,26,25,26] }, index=Index(['xbcde',np.nan,'zbcde','ybcde'],name='a2'))
407+
result = df.xs('z',level='a1')
408+
assert_frame_equal(result, expected)
409+
394410
def test_xs_partial(self):
395411
result = self.frame.xs('foo')
396412
result2 = self.frame.ix['foo']

0 commit comments

Comments
 (0)