From ebb312722cb37616fc004dd8923e848df8436b98 Mon Sep 17 00:00:00 2001 From: raj-thapa Date: Tue, 15 Aug 2023 00:35:46 +0000 Subject: [PATCH 1/3] Fixed unexpected np.nan value with reindex on pd.series with pd.IntervalIndex --- pandas/_libs/intervaltree.pxi.in | 5 +++++ pandas/tests/indexing/interval/test_interval.py | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/pandas/_libs/intervaltree.pxi.in b/pandas/_libs/intervaltree.pxi.in index 0b99aebbd3816..a6cec0fb30ecc 100644 --- a/pandas/_libs/intervaltree.pxi.in +++ b/pandas/_libs/intervaltree.pxi.in @@ -391,6 +391,11 @@ cdef class {{dtype_title}}Closed{{closed_title}}IntervalNode(IntervalNode): """Recursively query this node and its sub-nodes for intervals that overlap with the query point. """ + + # GH 51826: ensures nan is handled properly during reindexing + if np.isnan(point): + return + cdef: int64_t[:] indices {{dtype}}_t[:] values diff --git a/pandas/tests/indexing/interval/test_interval.py b/pandas/tests/indexing/interval/test_interval.py index 717cb7de42021..f3191e876f6d4 100644 --- a/pandas/tests/indexing/interval/test_interval.py +++ b/pandas/tests/indexing/interval/test_interval.py @@ -172,3 +172,20 @@ def test_mi_intervalindex_slicing_with_scalar(self): ) expected = Series([1, 6, 2, 8, 7], index=expected_index, name="value") tm.assert_series_equal(result, expected) + + @pytest.mark.parametrize( + "base, expected_result", + [ + (10, Series([np.nan, 0], index=[np.nan, 1.0], dtype=np.float64)), + (100, Series([np.nan, 0], index=[np.nan, 1.0], dtype=np.float64)), + (101, Series([np.nan, 0], index=[np.nan, 1.0], dtype=np.float64)), + (1010, Series([np.nan, 0], index=[np.nan, 1.0], dtype=np.float64)), + ], + ) + def test_reindex_behavior_with_interval_index(self, base, expected_result): + # GH 51826 + left = np.arange(base) + right = np.arange(1, base + 1) + d = Series(range(base), index=IntervalIndex.from_arrays(left, right)) + result = d.reindex(index=[np.nan, 1.0]) + tm.assert_series_equal(result, expected_result) From fc78db63656252569d709165be1df75ff6412b3b Mon Sep 17 00:00:00 2001 From: raj-thapa Date: Tue, 15 Aug 2023 22:17:16 +0000 Subject: [PATCH 2/3] Moving expected result to test body --- pandas/tests/indexing/interval/test_interval.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/pandas/tests/indexing/interval/test_interval.py b/pandas/tests/indexing/interval/test_interval.py index f3191e876f6d4..c7beeeeda4aac 100644 --- a/pandas/tests/indexing/interval/test_interval.py +++ b/pandas/tests/indexing/interval/test_interval.py @@ -174,18 +174,14 @@ def test_mi_intervalindex_slicing_with_scalar(self): tm.assert_series_equal(result, expected) @pytest.mark.parametrize( - "base, expected_result", - [ - (10, Series([np.nan, 0], index=[np.nan, 1.0], dtype=np.float64)), - (100, Series([np.nan, 0], index=[np.nan, 1.0], dtype=np.float64)), - (101, Series([np.nan, 0], index=[np.nan, 1.0], dtype=np.float64)), - (1010, Series([np.nan, 0], index=[np.nan, 1.0], dtype=np.float64)), - ], + "base", + [10, 100, 101, 1010], ) - def test_reindex_behavior_with_interval_index(self, base, expected_result): + def test_reindex_behavior_with_interval_index(self, base): # GH 51826 left = np.arange(base) right = np.arange(1, base + 1) - d = Series(range(base), index=IntervalIndex.from_arrays(left, right)) - result = d.reindex(index=[np.nan, 1.0]) + ser = Series(range(base), index=IntervalIndex.from_arrays(left, right)) + expected_result = Series([np.nan, 0], index=[np.nan, 1.0], dtype=np.float64) + result = ser.reindex(index=[np.nan, 1.0]) tm.assert_series_equal(result, expected_result) From 18177ffb132decd2f84b2d5e2061d2882930a64c Mon Sep 17 00:00:00 2001 From: raj-thapa Date: Thu, 17 Aug 2023 22:04:23 +0000 Subject: [PATCH 3/3] Fixed issues with Linux-32-bit test --- pandas/tests/indexing/interval/test_interval.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/pandas/tests/indexing/interval/test_interval.py b/pandas/tests/indexing/interval/test_interval.py index c7beeeeda4aac..97bd16d6eb1b4 100644 --- a/pandas/tests/indexing/interval/test_interval.py +++ b/pandas/tests/indexing/interval/test_interval.py @@ -1,6 +1,8 @@ import numpy as np import pytest +from pandas.compat import IS64 + import pandas as pd from pandas import ( DataFrame, @@ -173,15 +175,18 @@ def test_mi_intervalindex_slicing_with_scalar(self): expected = Series([1, 6, 2, 8, 7], index=expected_index, name="value") tm.assert_series_equal(result, expected) + @pytest.mark.xfail(not IS64, reason="GH 23440") @pytest.mark.parametrize( "base", - [10, 100, 101, 1010], + [101, 1010], ) def test_reindex_behavior_with_interval_index(self, base): # GH 51826 - left = np.arange(base) - right = np.arange(1, base + 1) - ser = Series(range(base), index=IntervalIndex.from_arrays(left, right)) - expected_result = Series([np.nan, 0], index=[np.nan, 1.0], dtype=np.float64) + + ser = Series( + range(base), + index=IntervalIndex.from_arrays(range(base), range(1, base + 1)), + ) + expected_result = Series([np.nan, 0], index=[np.nan, 1.0], dtype=float) result = ser.reindex(index=[np.nan, 1.0]) tm.assert_series_equal(result, expected_result)