Skip to content

Commit

Permalink
BUG: Fix Series.get failure on missing NaN (#8569) (#16619)
Browse files Browse the repository at this point in the history
(cherry picked from commit 2b44868)
  • Loading branch information
dsm054 authored and TomAugspurger committed Jul 7, 2017
1 parent 0e57df9 commit 6412251
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 1 deletion.
2 changes: 1 addition & 1 deletion doc/source/whatsnew/v0.20.3.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ Conversion
Indexing
^^^^^^^^


- Bug in ``Float64Index`` causing an empty array instead of None to be returned from ``.get(np.nan)`` on a Series whose index did not contain any NaNs (:issue:`8569`)

I/O
^^^
Expand Down
2 changes: 2 additions & 0 deletions pandas/core/indexes/numeric.py
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,8 @@ def get_loc(self, key, method=None, tolerance=None):
except (ValueError, IndexError):
# should only need to catch ValueError here but on numpy
# 1.7 .item() can raise IndexError when NaNs are present
if not len(nan_idxs):
raise KeyError(key)
return nan_idxs
except (TypeError, NotImplementedError):
pass
Expand Down
8 changes: 8 additions & 0 deletions pandas/tests/indexes/test_multi.py
Original file line number Diff line number Diff line change
Expand Up @@ -1172,6 +1172,14 @@ def test_get_loc_level(self):
assert result == expected
assert new_index.equals(index.droplevel(0))

def test_get_loc_missing_nan(self):
# GH 8569
idx = MultiIndex.from_arrays([[1.0, 2.0], [3.0, 4.0]])
assert isinstance(idx.get_loc(1), slice)
pytest.raises(KeyError, idx.get_loc, 3)
pytest.raises(KeyError, idx.get_loc, np.nan)
pytest.raises(KeyError, idx.get_loc, [np.nan])

def test_slice_locs(self):
df = tm.makeTimeDataFrame()
stacked = df.stack()
Expand Down
8 changes: 8 additions & 0 deletions pandas/tests/indexes/test_numeric.py
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,14 @@ def test_get_loc_na(self):
assert idx.get_loc(1) == 1
pytest.raises(KeyError, idx.slice_locs, np.nan)

def test_get_loc_missing_nan(self):
# GH 8569
idx = Float64Index([1, 2])
assert idx.get_loc(1) == 0
pytest.raises(KeyError, idx.get_loc, 3)
pytest.raises(KeyError, idx.get_loc, np.nan)
pytest.raises(KeyError, idx.get_loc, [np.nan])

def test_contains_nans(self):
i = Float64Index([1.0, 2.0, np.nan])
assert np.nan in i
Expand Down
15 changes: 15 additions & 0 deletions pandas/tests/series/test_indexing.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,21 @@ def test_get(self):
result = vc.get(True, default='Missing')
assert result == 'Missing'

def test_get_nan(self):
# GH 8569
s = pd.Float64Index(range(10)).to_series()
assert s.get(np.nan) is None
assert s.get(np.nan, default='Missing') == 'Missing'

# ensure that fixing the above hasn't broken get
# with multiple elements
idx = [20, 30]
assert_series_equal(s.get(idx),
Series([np.nan] * 2, index=idx))
idx = [np.nan, np.nan]
assert_series_equal(s.get(idx),
Series([np.nan] * 2, index=idx))

def test_delitem(self):

# GH 5542
Expand Down

0 comments on commit 6412251

Please sign in to comment.