Skip to content

Commit fbfe3ab

Browse files
committed
BUG: Fix IntervalIndex.insert to allow inserting NaN
1 parent 148ed63 commit fbfe3ab

File tree

3 files changed

+21
-8
lines changed

3 files changed

+21
-8
lines changed

doc/source/whatsnew/v0.21.1.txt

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ Bug Fixes
6262
- Bug in ``pd.Series.rolling.skew()`` and ``rolling.kurt()`` with all equal values has floating issue (:issue:`18044`)
6363
- Bug in ``pd.DataFrameGroupBy.count()`` when counting over a datetimelike column (:issue:`13393`)
6464
- Bug in ``pd.concat`` when empty and non-empty DataFrames or Series are concatenated (:issue:`18178` :issue:`18187`)
65+
- Bug in ``IntervalIndex.insert`` when attempting to insert ``NaN`` (:issue:`18295`)
6566

6667
Conversion
6768
^^^^^^^^^^

pandas/core/indexes/interval.py

+15-8
Original file line numberDiff line numberDiff line change
@@ -968,14 +968,21 @@ def delete(self, loc):
968968
return self._shallow_copy(new_left, new_right)
969969

970970
def insert(self, loc, item):
971-
if not isinstance(item, Interval):
972-
raise ValueError('can only insert Interval objects into an '
973-
'IntervalIndex')
974-
if not item.closed == self.closed:
975-
raise ValueError('inserted item must be closed on the same side '
976-
'as the index')
977-
new_left = self.left.insert(loc, item.left)
978-
new_right = self.right.insert(loc, item.right)
971+
if isinstance(item, Interval):
972+
if not item.closed == self.closed:
973+
raise ValueError('inserted item must be closed on the same '
974+
'side as the index')
975+
left_insert = item.left
976+
right_insert = item.right
977+
elif is_scalar(item) and isna(item):
978+
# GH 18295
979+
left_insert = right_insert = item
980+
else:
981+
raise ValueError('can only insert Interval objects and NaN into '
982+
'an IntervalIndex')
983+
984+
new_left = self.left.insert(loc, left_insert)
985+
new_right = self.right.insert(loc, right_insert)
979986
return self._shallow_copy(new_left, new_right)
980987

981988
def _as_like_interval_index(self, other, error_msg):

pandas/tests/indexes/test_interval.py

+5
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,11 @@ def test_insert(self):
255255
pytest.raises(ValueError, self.index.insert, 0,
256256
Interval(2, 3, closed='left'))
257257

258+
# GH 18295
259+
expected = self.index_with_nan
260+
result = self.index.insert(1, np.nan)
261+
tm.assert_index_equal(result, expected)
262+
258263
def test_take(self):
259264
actual = self.index.take([0, 1])
260265
assert self.index.equals(actual)

0 commit comments

Comments
 (0)