Skip to content

Commit 095256d

Browse files
committed
DEPR: deprecate .get_value and .set_value for Series, DataFrame, Panel, SparseSeries, SparseDataFrame
closes #15269
1 parent 8e89cb3 commit 095256d

14 files changed

+243
-62
lines changed

doc/source/whatsnew/v0.21.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,7 @@ Deprecations
666666
- ``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`)
667667
- passing ``categories`` or ``ordered`` kwargs to :func:`Series.astype` is deprecated, in favor of passing a :ref:`CategoricalDtype <whatsnew_0210.enhancements.categorical_dtype>` (:issue:`17636`)
668668
- Passing a non-existant column in ``.to_excel(..., columns=)`` is deprecated and will raise a ``KeyError`` in the future (:issue:`17295`)
669+
- ``.get_value`` and ``.set_value`` on ``Series``, ``DataFrame``, ``Panel``, ``SparseSeries``, and ``SparseDataFrame`` are deprecated in favor of using ``.iat[]`` or ``.at[]`` accessors
669670

670671
.. _whatsnew_0210.deprecations.argmin_min:
671672

pandas/core/frame.py

+26-4
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,8 @@ def _constructor(self):
297297
return DataFrame
298298

299299
_constructor_sliced = Series
300-
_deprecations = NDFrame._deprecations | frozenset(['sortlevel'])
300+
_deprecations = NDFrame._deprecations | frozenset(
301+
['sortlevel', 'get_value', 'set_value'])
301302

302303
@property
303304
def _constructor_expanddim(self):
@@ -1918,6 +1919,8 @@ def get_value(self, index, col, takeable=False):
19181919
"""
19191920
Quickly retrieve single value at passed column and index
19201921
1922+
.. deprecated:: 0.21.0
1923+
19211924
Parameters
19221925
----------
19231926
index : row label
@@ -1929,6 +1932,14 @@ def get_value(self, index, col, takeable=False):
19291932
value : scalar value
19301933
"""
19311934

1935+
warnings.warn("get_value is deprecated and will be removed "
1936+
"in a future release. Please use "
1937+
".at[] or .iat[] accessors instead", FutureWarning,
1938+
stacklevel=2)
1939+
return self._get_value(index, col, takeable=takeable)
1940+
1941+
def _get_value(self, index, col, takeable=False):
1942+
19321943
if takeable:
19331944
series = self._iget_item_cache(col)
19341945
return _maybe_box_datetimelike(series._values[index])
@@ -1944,12 +1955,15 @@ def get_value(self, index, col, takeable=False):
19441955
# use positional
19451956
col = self.columns.get_loc(col)
19461957
index = self.index.get_loc(index)
1947-
return self.get_value(index, col, takeable=True)
1958+
return self._get_value(index, col, takeable=True)
1959+
_get_value.__doc__ = get_value.__doc__
19481960

19491961
def set_value(self, index, col, value, takeable=False):
19501962
"""
19511963
Put single value at passed column and index
19521964
1965+
.. deprecated:: 0.21.0
1966+
19531967
Parameters
19541968
----------
19551969
index : row label
@@ -1963,10 +1977,17 @@ def set_value(self, index, col, value, takeable=False):
19631977
If label pair is contained, will be reference to calling DataFrame,
19641978
otherwise a new object
19651979
"""
1980+
warnings.warn("set_value is deprecated and will be removed "
1981+
"in a future release. Please use "
1982+
".at[] or .iat[] accessors instead", FutureWarning,
1983+
stacklevel=2)
1984+
return self._set_value(index, col, value, takeable=takeable)
1985+
1986+
def _set_value(self, index, col, value, takeable=False):
19661987
try:
19671988
if takeable is True:
19681989
series = self._iget_item_cache(col)
1969-
return series.set_value(index, value, takeable=True)
1990+
return series._set_value(index, value, takeable=True)
19701991

19711992
series = self._get_item_cache(col)
19721993
engine = self.index._engine
@@ -1979,6 +2000,7 @@ def set_value(self, index, col, value, takeable=False):
19792000
self._item_cache.pop(col, None)
19802001

19812002
return self
2003+
_set_value.__doc__ = set_value.__doc__
19822004

19832005
def _ixs(self, i, axis=0):
19842006
"""
@@ -2787,7 +2809,7 @@ def lookup(self, row_labels, col_labels):
27872809
else:
27882810
result = np.empty(n, dtype='O')
27892811
for i, (r, c) in enumerate(zip(row_labels, col_labels)):
2790-
result[i] = self.get_value(r, c)
2812+
result[i] = self._get_value(r, c)
27912813

27922814
if is_object_dtype(result):
27932815
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:
@@ -1501,7 +1501,7 @@ def _is_scalar_access(self, key):
15011501
def _getitem_scalar(self, key):
15021502
# a fast-path to scalar access
15031503
# if not, raise
1504-
values = self.obj.get_value(*key)
1504+
values = self.obj._get_value(*key)
15051505
return values
15061506

15071507
def _get_partial_string_timestamp_match_key(self, key, labels):
@@ -1657,7 +1657,7 @@ def _is_scalar_access(self, key):
16571657
def _getitem_scalar(self, key):
16581658
# a fast-path to scalar access
16591659
# if not, raise
1660-
values = self.obj.get_value(*key, takeable=True)
1660+
values = self.obj._get_value(*key, takeable=True)
16611661
return values
16621662

16631663
def _is_valid_integer(self, key, axis):
@@ -1814,7 +1814,7 @@ def __getitem__(self, key):
18141814
raise ValueError('Invalid call for scalar access (getting)!')
18151815

18161816
key = self._convert_key(key)
1817-
return self.obj.get_value(*key, takeable=self._takeable)
1817+
return self.obj._get_value(*key, takeable=self._takeable)
18181818

18191819
def __setitem__(self, key, value):
18201820
if isinstance(key, tuple):
@@ -1830,7 +1830,7 @@ def __setitem__(self, key, value):
18301830
'(setting)!')
18311831
key = list(self._convert_key(key, is_setter=True))
18321832
key.append(value)
1833-
self.obj.set_value(*key, takeable=self._takeable)
1833+
self.obj._set_value(*key, takeable=self._takeable)
18341834

18351835

18361836
class _AtIndexer(_ScalarAccessIndexer):

pandas/core/panel.py

+23-3
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,8 @@ def get_value(self, *args, **kwargs):
470470
"""
471471
Quickly retrieve single value at (item, major, minor) location
472472
473+
.. deprecated:: 0.21.0
474+
473475
Parameters
474476
----------
475477
item : item label (panel item)
@@ -481,6 +483,13 @@ def get_value(self, *args, **kwargs):
481483
-------
482484
value : scalar value
483485
"""
486+
warnings.warn("get_value is deprecated and will be removed "
487+
"in a future release. Please use "
488+
".at[] or .iat[] accessors instead", FutureWarning,
489+
stacklevel=2)
490+
return self._get_value(*args, **kwargs)
491+
492+
def _get_value(self, *args, **kwargs):
484493
nargs = len(args)
485494
nreq = self._AXIS_LEN
486495

@@ -500,12 +509,15 @@ def get_value(self, *args, **kwargs):
500509
else:
501510
lower = self._get_item_cache(args[0])
502511

503-
return lower.get_value(*args[1:], takeable=takeable)
512+
return lower._get_value(*args[1:], takeable=takeable)
513+
_get_value.__doc__ = get_value.__doc__
504514

505515
def set_value(self, *args, **kwargs):
506516
"""
507517
Quickly set single value at (item, major, minor) location
508518
519+
.. deprecated:: 0.21.0
520+
509521
Parameters
510522
----------
511523
item : item label (panel item)
@@ -520,6 +532,13 @@ def set_value(self, *args, **kwargs):
520532
If label combo is contained, will be reference to calling Panel,
521533
otherwise a new object
522534
"""
535+
warnings.warn("set_value is deprecated and will be removed "
536+
"in a future release. Please use "
537+
".at[] or .iat[] accessors instead", FutureWarning,
538+
stacklevel=2)
539+
return self._set_value(*args, **kwargs)
540+
541+
def _set_value(self, *args, **kwargs):
523542
# require an arg for each axis and the value
524543
nargs = len(args)
525544
nreq = self._AXIS_LEN + 1
@@ -540,7 +559,7 @@ def set_value(self, *args, **kwargs):
540559
else:
541560
lower = self._get_item_cache(args[0])
542561

543-
lower.set_value(*args[1:], takeable=takeable)
562+
lower._set_value(*args[1:], takeable=takeable)
544563
return self
545564
except KeyError:
546565
axes = self._expand_axes(args)
@@ -553,7 +572,8 @@ def set_value(self, *args, **kwargs):
553572
if made_bigger:
554573
maybe_cast_item(result, args[0], likely_dtype)
555574

556-
return result.set_value(*args)
575+
return result._set_value(*args)
576+
_set_value.__doc__ = set_value.__doc__
557577

558578
def _box_item_values(self, key, values):
559579
if self.ndim == values.ndim:

pandas/core/series.py

+23-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,8 @@ def get_value(self, label, takeable=False):
902902
"""
903903
Quickly retrieve single value at passed index label
904904
905+
.. deprecated:: 0.21.0
906+
905907
Parameters
906908
----------
907909
index : label
@@ -911,16 +913,26 @@ def get_value(self, label, takeable=False):
911913
-------
912914
value : scalar value
913915
"""
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):
914923
if takeable is True:
915924
return _maybe_box_datetimelike(self._values[label])
916925
return self.index.get_value(self._values, label)
926+
_get_value.__doc__ = get_value.__doc__
917927

918928
def set_value(self, label, value, takeable=False):
919929
"""
920930
Quickly set single value at passed label. If label is not contained, a
921931
new object is created with the label placed at the end of the result
922932
index
923933
934+
.. deprecated:: 0.21.0
935+
924936
Parameters
925937
----------
926938
label : object
@@ -935,17 +947,25 @@ def set_value(self, label, value, takeable=False):
935947
If label is contained, will be reference to calling Series,
936948
otherwise a new object
937949
"""
950+
warnings.warn("set_value is deprecated and will be removed "
951+
"in a future release. Please use "
952+
".at[] or .iat[] accessors instead", FutureWarning,
953+
stacklevel=2)
954+
return self._set_value(label, value, takeable=takeable)
955+
956+
def _set_value(self, label, value, takeable=False):
938957
try:
939958
if takeable:
940959
self._values[label] = value
941960
else:
942961
self.index._engine.set_value(self._values, label, value)
943-
return self
944962
except KeyError:
945963

946964
# set using a non-recursive method
947965
self.loc[label] = value
948-
return self
966+
967+
return self
968+
_set_value.__doc__ = set_value.__doc__
949969

950970
def reset_index(self, level=None, drop=False, name=None, inplace=False):
951971
"""

pandas/core/sparse/frame.py

+37-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from __future__ import division
66
# pylint: disable=E1101,E1103,W0231,E0202
77

8+
import warnings
89
from pandas.compat import lmap
910
from pandas import compat
1011
import numpy as np
@@ -430,19 +431,43 @@ def __getitem__(self, key):
430431
else:
431432
return self._get_item_cache(key)
432433

433-
@Appender(DataFrame.get_value.__doc__, indents=0)
434434
def get_value(self, index, col, takeable=False):
435+
"""
436+
Quickly retrieve single value at passed column and index
437+
438+
.. deprecated:: 0.21.0
439+
440+
Parameters
441+
----------
442+
index : row label
443+
col : column label
444+
takeable : interpret the index/col as indexers, default False
445+
446+
Returns
447+
-------
448+
value : scalar value
449+
"""
450+
warnings.warn("get_value is deprecated and will be removed "
451+
"in a future release. Please use "
452+
".at[] or .iat[] accessors instead", FutureWarning,
453+
stacklevel=2)
454+
return self._get_value(index, col, takeable=takeable)
455+
456+
def _get_value(self, index, col, takeable=False):
435457
if takeable is True:
436458
series = self._iget_item_cache(col)
437459
else:
438460
series = self._get_item_cache(col)
439461

440-
return series.get_value(index, takeable=takeable)
462+
return series._get_value(index, takeable=takeable)
463+
_get_value.__doc__ = get_value.__doc__
441464

442465
def set_value(self, index, col, value, takeable=False):
443466
"""
444467
Put single value at passed column and index
445468
469+
.. deprecated:: 0.21.0
470+
446471
Parameters
447472
----------
448473
index : row label
@@ -460,9 +485,18 @@ def set_value(self, index, col, value, takeable=False):
460485
-------
461486
frame : DataFrame
462487
"""
463-
dense = self.to_dense().set_value(index, col, value, takeable=takeable)
488+
warnings.warn("set_value is deprecated and will be removed "
489+
"in a future release. Please use "
490+
".at[] or .iat[] accessors instead", FutureWarning,
491+
stacklevel=2)
492+
return self._set_value(index, col, value, takeable=takeable)
493+
494+
def _set_value(self, index, col, value, takeable=False):
495+
dense = self.to_dense()._set_value(
496+
index, col, value, takeable=takeable)
464497
return dense.to_sparse(kind=self._default_kind,
465498
fill_value=self._default_fill_value)
499+
_set_value.__doc__ = set_value.__doc__
466500

467501
def _slice(self, slobj, axis=0, kind=None):
468502
if axis == 0:

0 commit comments

Comments
 (0)