Skip to content

Commit 890d097

Browse files
authored
DEPR: remove Index.get_value (#49208)
1 parent 66ad620 commit 890d097

File tree

12 files changed

+3
-184
lines changed

12 files changed

+3
-184
lines changed

doc/redirects.csv

-1
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,6 @@ generated/pandas.Index.get_indexer_non_unique,../reference/api/pandas.Index.get_
662662
generated/pandas.Index.get_level_values,../reference/api/pandas.Index.get_level_values
663663
generated/pandas.Index.get_loc,../reference/api/pandas.Index.get_loc
664664
generated/pandas.Index.get_slice_bound,../reference/api/pandas.Index.get_slice_bound
665-
generated/pandas.Index.get_value,../reference/api/pandas.Index.get_value
666665
generated/pandas.Index.groupby,../reference/api/pandas.Index.groupby
667666
generated/pandas.Index.has_duplicates,../reference/api/pandas.Index.has_duplicates
668667
generated/pandas.Index.hasnans,../reference/api/pandas.Index.hasnans

doc/source/reference/indexing.rst

-1
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,6 @@ Selecting
157157
Index.get_level_values
158158
Index.get_loc
159159
Index.get_slice_bound
160-
Index.get_value
161160
Index.isin
162161
Index.slice_indexer
163162
Index.slice_locs

doc/source/whatsnew/v2.0.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ Removal of prior version deprecations/changes
161161
- Removed deprecated :meth:`Timedelta.delta`, :meth:`Timedelta.is_populated`, and :attr:`Timedelta.freq` (:issue:`46430`, :issue:`46476`)
162162
- Removed the ``numeric_only`` keyword from :meth:`Categorical.min` and :meth:`Categorical.max` in favor of ``skipna`` (:issue:`48821`)
163163
- Removed :func:`is_extension_type` in favor of :func:`is_extension_array_dtype` (:issue:`29457`)
164+
- Removed :meth:`Index.get_value` (:issue:`33907`)
164165
- Remove :meth:`DataFrameGroupBy.pad` and :meth:`DataFrameGroupBy.backfill` (:issue:`45076`)
165166
- Remove ``numpy`` argument from :func:`read_json` (:issue:`30636`)
166167
- Removed the ``center`` keyword in :meth:`DataFrame.expanding` (:issue:`20647`)

pandas/core/indexes/base.py

-39
Original file line numberDiff line numberDiff line change
@@ -5952,45 +5952,6 @@ def argsort(self, *args, **kwargs) -> npt.NDArray[np.intp]:
59525952
# by RangeIndex, MultIIndex
59535953
return self._data.argsort(*args, **kwargs)
59545954

5955-
@final
5956-
def get_value(self, series: Series, key):
5957-
"""
5958-
Fast lookup of value from 1-dimensional ndarray.
5959-
5960-
Only use this if you know what you're doing.
5961-
5962-
Returns
5963-
-------
5964-
scalar or Series
5965-
"""
5966-
warnings.warn(
5967-
"get_value is deprecated and will be removed in a future version. "
5968-
"Use Series[key] instead.",
5969-
FutureWarning,
5970-
stacklevel=find_stack_level(),
5971-
)
5972-
5973-
self._check_indexing_error(key)
5974-
5975-
try:
5976-
# GH 20882, 21257
5977-
# First try to convert the key to a location
5978-
# If that fails, raise a KeyError if an integer
5979-
# index, otherwise, see if key is an integer, and
5980-
# try that
5981-
loc = self.get_loc(key)
5982-
except KeyError:
5983-
if not self._should_fallback_to_positional:
5984-
raise
5985-
elif is_integer(key):
5986-
# If the Index cannot hold integer, then this is unambiguously
5987-
# a locational lookup.
5988-
loc = key
5989-
else:
5990-
raise
5991-
5992-
return self._get_values_for_loc(series, loc, key)
5993-
59945955
def _check_indexing_error(self, key):
59955956
if not is_scalar(key):
59965957
# if key is not a scalar, directly raise an error (the code below

pandas/tests/indexes/datetimes/test_indexing.py

-27
Original file line numberDiff line numberDiff line change
@@ -710,33 +710,6 @@ def test_maybe_cast_slice_duplicate_monotonic(self):
710710
assert result == expected
711711

712712

713-
class TestGetValue:
714-
def test_get_value(self):
715-
# specifically make sure we have test for np.datetime64 key
716-
dti = date_range("2016-01-01", periods=3)
717-
718-
arr = np.arange(6, 9)
719-
ser = pd.Series(arr, index=dti)
720-
721-
key = dti[1]
722-
723-
with pytest.raises(AttributeError, match="has no attribute '_values'"):
724-
with tm.assert_produces_warning(FutureWarning):
725-
dti.get_value(arr, key)
726-
727-
with tm.assert_produces_warning(FutureWarning):
728-
result = dti.get_value(ser, key)
729-
assert result == 7
730-
731-
with tm.assert_produces_warning(FutureWarning):
732-
result = dti.get_value(ser, key.to_pydatetime())
733-
assert result == 7
734-
735-
with tm.assert_produces_warning(FutureWarning):
736-
result = dti.get_value(ser, key.to_datetime64())
737-
assert result == 7
738-
739-
740713
class TestGetSliceBounds:
741714
@pytest.mark.parametrize("box", [date, datetime, Timestamp])
742715
@pytest.mark.parametrize("kind", ["getitem", "loc", None])

pandas/tests/indexes/interval/test_indexing.py

-14
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
IntervalIndex,
1515
MultiIndex,
1616
NaT,
17-
Series,
1817
Timedelta,
1918
Timestamp,
2019
array,
@@ -582,19 +581,6 @@ def test_putmask_td64(self):
582581
tm.assert_index_equal(result, expected)
583582

584583

585-
class TestGetValue:
586-
@pytest.mark.parametrize("key", [[5], (2, 3)])
587-
def test_get_value_non_scalar_errors(self, key):
588-
# GH#31117
589-
idx = IntervalIndex.from_tuples([(1, 3), (2, 4), (3, 5), (7, 10), (3, 10)])
590-
ser = Series(range(len(idx)), index=idx)
591-
592-
msg = str(key)
593-
with pytest.raises(InvalidIndexError, match=msg):
594-
with tm.assert_produces_warning(FutureWarning):
595-
idx.get_value(ser, key)
596-
597-
598584
class TestContains:
599585
# .__contains__, not .contains
600586

pandas/tests/indexes/numeric/test_numeric.py

-7
Original file line numberDiff line numberDiff line change
@@ -211,13 +211,6 @@ def test_lookups_datetimelike_values(self, vals, dtype):
211211

212212
expected = vals[1]
213213

214-
with tm.assert_produces_warning(FutureWarning):
215-
result = ser.index.get_value(ser, 4.0)
216-
assert isinstance(result, type(expected)) and result == expected
217-
with tm.assert_produces_warning(FutureWarning):
218-
result = ser.index.get_value(ser, 4)
219-
assert isinstance(result, type(expected)) and result == expected
220-
221214
result = ser[4.0]
222215
assert isinstance(result, type(expected)) and result == expected
223216
result = ser[4]

pandas/tests/indexes/period/test_indexing.py

+2-57
Original file line numberDiff line numberDiff line change
@@ -774,85 +774,34 @@ def test_take_fill_value(self):
774774

775775

776776
class TestGetValue:
777-
def test_get_value(self):
778-
# GH 17717
779-
p0 = Period("2017-09-01")
780-
p1 = Period("2017-09-02")
781-
p2 = Period("2017-09-03")
782-
783-
idx0 = PeriodIndex([p0, p1, p2])
784-
input0 = Series(np.array([1, 2, 3]), index=idx0)
785-
expected0 = 2
786-
787-
with tm.assert_produces_warning(FutureWarning):
788-
result0 = idx0.get_value(input0, p1)
789-
assert result0 == expected0
790-
791-
idx1 = PeriodIndex([p1, p1, p2])
792-
input1 = Series(np.array([1, 2, 3]), index=idx1)
793-
expected1 = input1.iloc[[0, 1]]
794-
795-
with tm.assert_produces_warning(FutureWarning):
796-
result1 = idx1.get_value(input1, p1)
797-
tm.assert_series_equal(result1, expected1)
798-
799-
idx2 = PeriodIndex([p1, p2, p1])
800-
input2 = Series(np.array([1, 2, 3]), index=idx2)
801-
expected2 = input2.iloc[[0, 2]]
802-
803-
with tm.assert_produces_warning(FutureWarning):
804-
result2 = idx2.get_value(input2, p1)
805-
tm.assert_series_equal(result2, expected2)
806-
807777
@pytest.mark.parametrize("freq", ["H", "D"])
808778
def test_get_value_datetime_hourly(self, freq):
809779
# get_loc and get_value should treat datetime objects symmetrically
780+
# TODO: this test used to test get_value, which is removed in 2.0.
781+
# should this test be moved somewhere, or is what's left redundant?
810782
dti = date_range("2016-01-01", periods=3, freq="MS")
811783
pi = dti.to_period(freq)
812784
ser = Series(range(7, 10), index=pi)
813785

814786
ts = dti[0]
815787

816788
assert pi.get_loc(ts) == 0
817-
with tm.assert_produces_warning(FutureWarning):
818-
assert pi.get_value(ser, ts) == 7
819789
assert ser[ts] == 7
820790
assert ser.loc[ts] == 7
821791

822792
ts2 = ts + Timedelta(hours=3)
823793
if freq == "H":
824794
with pytest.raises(KeyError, match="2016-01-01 03:00"):
825795
pi.get_loc(ts2)
826-
with pytest.raises(KeyError, match="2016-01-01 03:00"):
827-
with tm.assert_produces_warning(FutureWarning):
828-
pi.get_value(ser, ts2)
829796
with pytest.raises(KeyError, match="2016-01-01 03:00"):
830797
ser[ts2]
831798
with pytest.raises(KeyError, match="2016-01-01 03:00"):
832799
ser.loc[ts2]
833800
else:
834801
assert pi.get_loc(ts2) == 0
835-
with tm.assert_produces_warning(FutureWarning):
836-
assert pi.get_value(ser, ts2) == 7
837802
assert ser[ts2] == 7
838803
assert ser.loc[ts2] == 7
839804

840-
def test_get_value_integer(self):
841-
msg = "index 16801 is out of bounds for axis 0 with size 3"
842-
dti = date_range("2016-01-01", periods=3)
843-
pi = dti.to_period("D")
844-
ser = Series(range(3), index=pi)
845-
with pytest.raises(IndexError, match=msg):
846-
with tm.assert_produces_warning(FutureWarning):
847-
pi.get_value(ser, 16801)
848-
849-
msg = "index 46 is out of bounds for axis 0 with size 3"
850-
pi2 = dti.to_period("Y") # duplicates, ordinals are all 46
851-
ser2 = Series(range(3), index=pi2)
852-
with pytest.raises(IndexError, match=msg):
853-
with tm.assert_produces_warning(FutureWarning):
854-
pi2.get_value(ser2, 46)
855-
856805

857806
class TestContains:
858807
def test_contains(self):
@@ -864,7 +813,6 @@ def test_contains(self):
864813

865814
ps0 = [p0, p1, p2]
866815
idx0 = PeriodIndex(ps0)
867-
ser = Series(range(6, 9), index=idx0)
868816

869817
for p in ps0:
870818
assert p in idx0
@@ -876,9 +824,6 @@ def test_contains(self):
876824
assert key not in idx0
877825
with pytest.raises(KeyError, match=key):
878826
idx0.get_loc(key)
879-
with pytest.raises(KeyError, match=key):
880-
with tm.assert_produces_warning(FutureWarning):
881-
idx0.get_value(ser, key)
882827

883828
assert "2017-09" in idx0
884829

pandas/tests/indexes/period/test_partial_slicing.py

-10
Original file line numberDiff line numberDiff line change
@@ -174,11 +174,6 @@ def test_partial_slice_doesnt_require_monotonicity(self):
174174
tm.assert_numpy_array_equal(result, indexer_2014)
175175

176176
expected = ser[indexer_2014]
177-
178-
with tm.assert_produces_warning(FutureWarning):
179-
result = nidx.get_value(ser, "2014")
180-
tm.assert_series_equal(result, expected)
181-
182177
result = ser.loc["2014"]
183178
tm.assert_series_equal(result, expected)
184179

@@ -193,11 +188,6 @@ def test_partial_slice_doesnt_require_monotonicity(self):
193188
tm.assert_numpy_array_equal(result, indexer_may2015)
194189

195190
expected = ser[indexer_may2015]
196-
197-
with tm.assert_produces_warning(FutureWarning):
198-
result = nidx.get_value(ser, "May 2015")
199-
tm.assert_series_equal(result, expected)
200-
201191
result = ser.loc["May 2015"]
202192
tm.assert_series_equal(result, expected)
203193

pandas/tests/indexes/test_indexing.py

-20
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
NaT,
2929
PeriodIndex,
3030
RangeIndex,
31-
Series,
3231
TimedeltaIndex,
3332
)
3433
import pandas._testing as tm
@@ -176,25 +175,6 @@ def test_contains_requires_hashable_raises(self, index):
176175
{} in index._engine
177176

178177

179-
class TestGetValue:
180-
@pytest.mark.parametrize(
181-
"index", ["string", "int", "datetime", "timedelta"], indirect=True
182-
)
183-
def test_get_value(self, index):
184-
# TODO(2.0): can remove once get_value deprecation is enforced GH#19728
185-
values = np.random.randn(100)
186-
value = index[67]
187-
188-
with pytest.raises(AttributeError, match="has no attribute '_values'"):
189-
# Index.get_value requires a Series, not an ndarray
190-
with tm.assert_produces_warning(FutureWarning):
191-
index.get_value(values, value)
192-
193-
with tm.assert_produces_warning(FutureWarning):
194-
result = index.get_value(Series(values, index=values), value)
195-
tm.assert_almost_equal(result, values[67])
196-
197-
198178
class TestGetLoc:
199179
def test_get_loc_non_hashable(self, index):
200180
# MultiIndex and Index raise TypeError, others InvalidIndexError

pandas/tests/indexing/multiindex/test_partial.py

-3
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,6 @@ def test_getitem_intkey_leading_level(
171171

172172
with pytest.raises(KeyError, match="14"):
173173
ser[14]
174-
with pytest.raises(KeyError, match="14"):
175-
with tm.assert_produces_warning(FutureWarning):
176-
mi.get_value(ser, 14)
177174

178175
# ---------------------------------------------------------------------
179176

pandas/tests/series/indexing/test_getitem.py

-5
Original file line numberDiff line numberDiff line change
@@ -686,11 +686,6 @@ def test_getitem_categorical_str():
686686
expected = ser.iloc[[0, 3]]
687687
tm.assert_series_equal(result, expected)
688688

689-
# Check the intermediate steps work as expected
690-
with tm.assert_produces_warning(FutureWarning):
691-
result = ser.index.get_value(ser, "a")
692-
tm.assert_series_equal(result, expected)
693-
694689

695690
def test_slice_can_reorder_not_uniquely_indexed():
696691
ser = Series(1, index=["a", "a", "b", "b", "c"])

0 commit comments

Comments
 (0)