Skip to content

Commit 21d3bb0

Browse files
committed
DEPR: deprecate .get_value and .set_value for Series, DataFrame, Panel, SparseSeries, SparseDataFrame
closes #15269
1 parent a607872 commit 21d3bb0

14 files changed

+391
-62
lines changed

doc/source/whatsnew/v0.21.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,7 @@ Deprecations
572572
- :func:`DataFrame.as_blocks` is deprecated, as this is exposing the internal implementation (:issue:`17302`)
573573
- ``pd.TimeGrouper`` is deprecated in favor of :class:`pandas.Grouper` (:issue:`16747`)
574574
- ``cdate_range`` has been deprecated in favor of :func:`bdate_range`, which has gained ``weekmask`` and ``holidays`` parameters for building custom frequency date ranges. See the :ref:`documentation <timeseries.custom-freq-ranges>` for more details (:issue:`17596`)
575+
- ``.get_value`` and ``.set_value`` on ``Series``, ``DataFrame``, ``Panel``, ``SparseSeries``, and ``SparseDataFrame`` are deprecated in favor of using ``.iat[]`` or ``.at[]`` accessors
575576

576577
.. _whatsnew_0210.deprecations.argmin_min:
577578

pandas/core/frame.py

+53-4
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,8 @@ def _constructor(self):
299299
return DataFrame
300300

301301
_constructor_sliced = Series
302-
_deprecations = NDFrame._deprecations | frozenset(['sortlevel'])
302+
_deprecations = NDFrame._deprecations | frozenset(
303+
['sortlevel', 'get_value', 'set_value'])
303304

304305
@property
305306
def _constructor_expanddim(self):
@@ -1920,6 +1921,29 @@ def get_value(self, index, col, takeable=False):
19201921
"""
19211922
Quickly retrieve single value at passed column and index
19221923
1924+
.. deprecated:: 0.21.0
1925+
1926+
Parameters
1927+
----------
1928+
index : row label
1929+
col : column label
1930+
takeable : interpret the index/col as indexers, default False
1931+
1932+
Returns
1933+
-------
1934+
value : scalar value
1935+
"""
1936+
1937+
warnings.warn("get_value is deprecated and will be removed "
1938+
"in a future release. Please use "
1939+
".at[] or .iat[] accessors instead", FutureWarning,
1940+
stacklevel=2)
1941+
return self._get_value(index, col, takeable=takeable)
1942+
1943+
def _get_value(self, index, col, takeable=False):
1944+
"""
1945+
Quickly retrieve single value at passed column and index
1946+
19231947
Parameters
19241948
----------
19251949
index : row label
@@ -1946,12 +1970,37 @@ def get_value(self, index, col, takeable=False):
19461970
# use positional
19471971
col = self.columns.get_loc(col)
19481972
index = self.index.get_loc(index)
1949-
return self.get_value(index, col, takeable=True)
1973+
return self._get_value(index, col, takeable=True)
19501974

19511975
def set_value(self, index, col, value, takeable=False):
19521976
"""
19531977
Put single value at passed column and index
19541978
1979+
.. deprecated:: 0.21.0
1980+
1981+
Parameters
1982+
----------
1983+
index : row label
1984+
col : column label
1985+
value : scalar value
1986+
takeable : interpret the index/col as indexers, default False
1987+
1988+
Returns
1989+
-------
1990+
frame : DataFrame
1991+
If label pair is contained, will be reference to calling DataFrame,
1992+
otherwise a new object
1993+
"""
1994+
warnings.warn("set_value is deprecated and will be removed "
1995+
"in a future release. Please use "
1996+
".at[] or .iat[] accessors instead", FutureWarning,
1997+
stacklevel=2)
1998+
return self._set_value(index, col, value, takeable=takeable)
1999+
2000+
def _set_value(self, index, col, value, takeable=False):
2001+
"""
2002+
Put single value at passed column and index
2003+
19552004
Parameters
19562005
----------
19572006
index : row label
@@ -1968,7 +2017,7 @@ def set_value(self, index, col, value, takeable=False):
19682017
try:
19692018
if takeable is True:
19702019
series = self._iget_item_cache(col)
1971-
return series.set_value(index, value, takeable=True)
2020+
return series._set_value(index, value, takeable=True)
19722021

19732022
series = self._get_item_cache(col)
19742023
engine = self.index._engine
@@ -2787,7 +2836,7 @@ def lookup(self, row_labels, col_labels):
27872836
else:
27882837
result = np.empty(n, dtype='O')
27892838
for i, (r, c) in enumerate(zip(row_labels, col_labels)):
2790-
result[i] = self.get_value(r, c)
2839+
result[i] = self._get_value(r, c)
27912840

27922841
if is_object_dtype(result):
27932842
result = lib.maybe_convert_objects(result)

pandas/core/indexing.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def __getitem__(self, key):
109109
if type(key) is tuple:
110110
key = tuple(com._apply_if_callable(x, self.obj) for x in key)
111111
try:
112-
values = self.obj.get_value(*key)
112+
values = self.obj._get_value(*key)
113113
if is_scalar(values):
114114
return values
115115
except Exception:
@@ -1481,7 +1481,7 @@ def _is_scalar_access(self, key):
14811481
def _getitem_scalar(self, key):
14821482
# a fast-path to scalar access
14831483
# if not, raise
1484-
values = self.obj.get_value(*key)
1484+
values = self.obj._get_value(*key)
14851485
return values
14861486

14871487
def _get_partial_string_timestamp_match_key(self, key, labels):
@@ -1637,7 +1637,7 @@ def _is_scalar_access(self, key):
16371637
def _getitem_scalar(self, key):
16381638
# a fast-path to scalar access
16391639
# if not, raise
1640-
values = self.obj.get_value(*key, takeable=True)
1640+
values = self.obj._get_value(*key, takeable=True)
16411641
return values
16421642

16431643
def _is_valid_integer(self, key, axis):
@@ -1794,7 +1794,7 @@ def __getitem__(self, key):
17941794
raise ValueError('Invalid call for scalar access (getting)!')
17951795

17961796
key = self._convert_key(key)
1797-
return self.obj.get_value(*key, takeable=self._takeable)
1797+
return self.obj._get_value(*key, takeable=self._takeable)
17981798

17991799
def __setitem__(self, key, value):
18001800
if isinstance(key, tuple):
@@ -1810,7 +1810,7 @@ def __setitem__(self, key, value):
18101810
'(setting)!')
18111811
key = list(self._convert_key(key, is_setter=True))
18121812
key.append(value)
1813-
self.obj.set_value(*key, takeable=self._takeable)
1813+
self.obj._set_value(*key, takeable=self._takeable)
18141814

18151815

18161816
class _AtIndexer(_ScalarAccessIndexer):

pandas/core/panel.py

+52-3
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,29 @@ def get_value(self, *args, **kwargs):
471471
"""
472472
Quickly retrieve single value at (item, major, minor) location
473473
474+
.. deprecated:: 0.21.0
475+
476+
Parameters
477+
----------
478+
item : item label (panel item)
479+
major : major axis label (panel item row)
480+
minor : minor axis label (panel item column)
481+
takeable : interpret the passed labels as indexers, default False
482+
483+
Returns
484+
-------
485+
value : scalar value
486+
"""
487+
warnings.warn("get_value is deprecated and will be removed "
488+
"in a future release. Please use "
489+
".at[] or .iat[] accessors instead", FutureWarning,
490+
stacklevel=2)
491+
return self._get_value(*args, **kwargs)
492+
493+
def _get_value(self, *args, **kwargs):
494+
"""
495+
Quickly retrieve single value at (item, major, minor) location
496+
474497
Parameters
475498
----------
476499
item : item label (panel item)
@@ -501,12 +524,38 @@ def get_value(self, *args, **kwargs):
501524
else:
502525
lower = self._get_item_cache(args[0])
503526

504-
return lower.get_value(*args[1:], takeable=takeable)
527+
return lower._get_value(*args[1:], takeable=takeable)
505528

506529
def set_value(self, *args, **kwargs):
507530
"""
508531
Quickly set single value at (item, major, minor) location
509532
533+
.. deprecated:: 0.21.0
534+
535+
Parameters
536+
----------
537+
item : item label (panel item)
538+
major : major axis label (panel item row)
539+
minor : minor axis label (panel item column)
540+
value : scalar
541+
takeable : interpret the passed labels as indexers, default False
542+
543+
Returns
544+
-------
545+
panel : Panel
546+
If label combo is contained, will be reference to calling Panel,
547+
otherwise a new object
548+
"""
549+
warnings.warn("set_value is deprecated and will be removed "
550+
"in a future release. Please use "
551+
".at[] or .iat[] accessors instead", FutureWarning,
552+
stacklevel=2)
553+
return self._set_value(*args, **kwargs)
554+
555+
def _set_value(self, *args, **kwargs):
556+
"""
557+
Quickly set single value at (item, major, minor) location
558+
510559
Parameters
511560
----------
512561
item : item label (panel item)
@@ -541,7 +590,7 @@ def set_value(self, *args, **kwargs):
541590
else:
542591
lower = self._get_item_cache(args[0])
543592

544-
lower.set_value(*args[1:], takeable=takeable)
593+
lower._set_value(*args[1:], takeable=takeable)
545594
return self
546595
except KeyError:
547596
axes = self._expand_axes(args)
@@ -554,7 +603,7 @@ def set_value(self, *args, **kwargs):
554603
if made_bigger:
555604
maybe_cast_item(result, args[0], likely_dtype)
556605

557-
return result.set_value(*args)
606+
return result._set_value(*args)
558607

559608
def _box_item_values(self, key, values):
560609
if self.ndim == values.ndim:

pandas/core/series.py

+52-3
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ class Series(base.IndexOpsMixin, generic.NDFrame):
147147
_metadata = ['name']
148148
_accessors = frozenset(['dt', 'cat', 'str'])
149149
_deprecations = generic.NDFrame._deprecations | frozenset(
150-
['sortlevel', 'reshape'])
150+
['sortlevel', 'reshape', 'get_value', 'set_value'])
151151
_allow_index_ops = True
152152

153153
def __init__(self, data=None, index=None, dtype=None, name=None,
@@ -902,6 +902,27 @@ def get_value(self, label, takeable=False):
902902
"""
903903
Quickly retrieve single value at passed index label
904904
905+
.. deprecated:: 0.21.0
906+
907+
Parameters
908+
----------
909+
index : label
910+
takeable : interpret the index as indexers, default False
911+
912+
Returns
913+
-------
914+
value : scalar value
915+
"""
916+
warnings.warn("get_value is deprecated and will be removed "
917+
"in a future release. Please use "
918+
".at[] or .iat[] accessors instead", FutureWarning,
919+
stacklevel=2)
920+
return self._get_value(label, takeable=takeable)
921+
922+
def _get_value(self, label, takeable=False):
923+
"""
924+
Quickly retrieve single value at passed index label
925+
905926
Parameters
906927
----------
907928
index : label
@@ -921,6 +942,34 @@ def set_value(self, label, value, takeable=False):
921942
new object is created with the label placed at the end of the result
922943
index
923944
945+
.. deprecated:: 0.21.0
946+
947+
Parameters
948+
----------
949+
label : object
950+
Partial indexing with MultiIndex not allowed
951+
value : object
952+
Scalar value
953+
takeable : interpret the index as indexers, default False
954+
955+
Returns
956+
-------
957+
series : Series
958+
If label is contained, will be reference to calling Series,
959+
otherwise a new object
960+
"""
961+
warnings.warn("set_value is deprecated and will be removed "
962+
"in a future release. Please use "
963+
".at[] or .iat[] accessors instead", FutureWarning,
964+
stacklevel=2)
965+
return self._set_value(label, value, takeable=takeable)
966+
967+
def _set_value(self, label, value, takeable=False):
968+
"""
969+
Quickly set single value at passed label. If label is not contained, a
970+
new object is created with the label placed at the end of the result
971+
index
972+
924973
Parameters
925974
----------
926975
label : object
@@ -940,12 +989,12 @@ def set_value(self, label, value, takeable=False):
940989
self._values[label] = value
941990
else:
942991
self.index._engine.set_value(self._values, label, value)
943-
return self
944992
except KeyError:
945993

946994
# set using a non-recursive method
947995
self.loc[label] = value
948-
return self
996+
997+
return self
949998

950999
def reset_index(self, level=None, drop=False, name=None, inplace=False):
9511000
"""

0 commit comments

Comments
 (0)