Skip to content

Commit 3fae8dd

Browse files
authored
DEPR: deprecate .get_value and .set_value for Series, DataFrame, Panel, SparseSeries, SparseDataFrame (#17739)
closes #15269
1 parent 6773694 commit 3fae8dd

14 files changed

+264
-63
lines changed

doc/source/whatsnew/v0.21.0.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -666,7 +666,8 @@ Deprecations
666666
- ``pd.TimeGrouper`` is deprecated in favor of :class:`pandas.Grouper` (:issue:`16747`)
667667
- ``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`)
668668
- 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`)
669-
- Passing a non-existant column in ``.to_excel(..., columns=)`` is deprecated and will raise a ``KeyError`` in the future (:issue:`17295`)
669+
- Passing a non-existent column in ``.to_excel(..., columns=)`` is deprecated and will raise a ``KeyError`` in the future (:issue:`17295`)
670+
- ``.get_value`` and ``.set_value`` on ``Series``, ``DataFrame``, ``Panel``, ``SparseSeries``, and ``SparseDataFrame`` are deprecated in favor of using ``.iat[]`` or ``.at[]`` accessors (:issue:`15269`)
670671

671672
.. _whatsnew_0210.deprecations.select:
672673

pandas/core/frame.py

+30-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):
@@ -1922,6 +1923,10 @@ def get_value(self, index, col, takeable=False):
19221923
"""
19231924
Quickly retrieve single value at passed column and index
19241925
1926+
.. deprecated:: 0.21.0
1927+
1928+
Please use .at[] or .iat[] accessors.
1929+
19251930
Parameters
19261931
----------
19271932
index : row label
@@ -1933,6 +1938,14 @@ def get_value(self, index, col, takeable=False):
19331938
value : scalar value
19341939
"""
19351940

1941+
warnings.warn("get_value is deprecated and will be removed "
1942+
"in a future release. Please use "
1943+
".at[] or .iat[] accessors instead", FutureWarning,
1944+
stacklevel=2)
1945+
return self._get_value(index, col, takeable=takeable)
1946+
1947+
def _get_value(self, index, col, takeable=False):
1948+
19361949
if takeable:
19371950
series = self._iget_item_cache(col)
19381951
return _maybe_box_datetimelike(series._values[index])
@@ -1948,12 +1961,17 @@ def get_value(self, index, col, takeable=False):
19481961
# use positional
19491962
col = self.columns.get_loc(col)
19501963
index = self.index.get_loc(index)
1951-
return self.get_value(index, col, takeable=True)
1964+
return self._get_value(index, col, takeable=True)
1965+
_get_value.__doc__ = get_value.__doc__
19521966

19531967
def set_value(self, index, col, value, takeable=False):
19541968
"""
19551969
Put single value at passed column and index
19561970
1971+
.. deprecated:: 0.21.0
1972+
1973+
Please use .at[] or .iat[] accessors.
1974+
19571975
Parameters
19581976
----------
19591977
index : row label
@@ -1967,10 +1985,17 @@ def set_value(self, index, col, value, takeable=False):
19671985
If label pair is contained, will be reference to calling DataFrame,
19681986
otherwise a new object
19691987
"""
1988+
warnings.warn("set_value is deprecated and will be removed "
1989+
"in a future release. Please use "
1990+
".at[] or .iat[] accessors instead", FutureWarning,
1991+
stacklevel=2)
1992+
return self._set_value(index, col, value, takeable=takeable)
1993+
1994+
def _set_value(self, index, col, value, takeable=False):
19701995
try:
19711996
if takeable is True:
19721997
series = self._iget_item_cache(col)
1973-
return series.set_value(index, value, takeable=True)
1998+
return series._set_value(index, value, takeable=True)
19741999

19752000
series = self._get_item_cache(col)
19762001
engine = self.index._engine
@@ -1983,6 +2008,7 @@ def set_value(self, index, col, value, takeable=False):
19832008
self._item_cache.pop(col, None)
19842009

19852010
return self
2011+
_set_value.__doc__ = set_value.__doc__
19862012

19872013
def _ixs(self, i, axis=0):
19882014
"""
@@ -2791,7 +2817,7 @@ def lookup(self, row_labels, col_labels):
27912817
else:
27922818
result = np.empty(n, dtype='O')
27932819
for i, (r, c) in enumerate(zip(row_labels, col_labels)):
2794-
result[i] = self.get_value(r, c)
2820+
result[i] = self._get_value(r, c)
27952821

27962822
if is_object_dtype(result):
27972823
result = lib.maybe_convert_objects(result)

pandas/core/indexing.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ def __getitem__(self, key):
112112
key = tuple(com._apply_if_callable(x, self.obj)
113113
for x in key)
114114
try:
115-
values = self.obj.get_value(*key)
115+
values = self.obj._get_value(*key)
116116
if is_scalar(values):
117117
return values
118118
except Exception:
@@ -1542,7 +1542,7 @@ def _is_scalar_access(self, key):
15421542
def _getitem_scalar(self, key):
15431543
# a fast-path to scalar access
15441544
# if not, raise
1545-
values = self.obj.get_value(*key)
1545+
values = self.obj._get_value(*key)
15461546
return values
15471547

15481548
def _get_partial_string_timestamp_match_key(self, key, labels):
@@ -1701,7 +1701,7 @@ def _is_scalar_access(self, key):
17011701
def _getitem_scalar(self, key):
17021702
# a fast-path to scalar access
17031703
# if not, raise
1704-
values = self.obj.get_value(*key, takeable=True)
1704+
values = self.obj._get_value(*key, takeable=True)
17051705
return values
17061706

17071707
def _is_valid_integer(self, key, axis):
@@ -1866,7 +1866,7 @@ def __getitem__(self, key):
18661866
raise ValueError('Invalid call for scalar access (getting)!')
18671867

18681868
key = self._convert_key(key)
1869-
return self.obj.get_value(*key, takeable=self._takeable)
1869+
return self.obj._get_value(*key, takeable=self._takeable)
18701870

18711871
def __setitem__(self, key, value):
18721872
if isinstance(key, tuple):
@@ -1883,7 +1883,7 @@ def __setitem__(self, key, value):
18831883
'(setting)!')
18841884
key = list(self._convert_key(key, is_setter=True))
18851885
key.append(value)
1886-
self.obj.set_value(*key, takeable=self._takeable)
1886+
self.obj._set_value(*key, takeable=self._takeable)
18871887

18881888

18891889
class _AtIndexer(_ScalarAccessIndexer):

pandas/core/panel.py

+27-3
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,10 @@ def get_value(self, *args, **kwargs):
470470
"""
471471
Quickly retrieve single value at (item, major, minor) location
472472
473+
.. deprecated:: 0.21.0
474+
475+
Please use .at[] or .iat[] accessors.
476+
473477
Parameters
474478
----------
475479
item : item label (panel item)
@@ -481,6 +485,13 @@ def get_value(self, *args, **kwargs):
481485
-------
482486
value : scalar value
483487
"""
488+
warnings.warn("get_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._get_value(*args, **kwargs)
493+
494+
def _get_value(self, *args, **kwargs):
484495
nargs = len(args)
485496
nreq = self._AXIS_LEN
486497

@@ -500,12 +511,17 @@ def get_value(self, *args, **kwargs):
500511
else:
501512
lower = self._get_item_cache(args[0])
502513

503-
return lower.get_value(*args[1:], takeable=takeable)
514+
return lower._get_value(*args[1:], takeable=takeable)
515+
_get_value.__doc__ = get_value.__doc__
504516

505517
def set_value(self, *args, **kwargs):
506518
"""
507519
Quickly set single value at (item, major, minor) location
508520
521+
.. deprecated:: 0.21.0
522+
523+
Please use .at[] or .iat[] accessors.
524+
509525
Parameters
510526
----------
511527
item : item label (panel item)
@@ -520,6 +536,13 @@ def set_value(self, *args, **kwargs):
520536
If label combo is contained, will be reference to calling Panel,
521537
otherwise a new object
522538
"""
539+
warnings.warn("set_value is deprecated and will be removed "
540+
"in a future release. Please use "
541+
".at[] or .iat[] accessors instead", FutureWarning,
542+
stacklevel=2)
543+
return self._set_value(*args, **kwargs)
544+
545+
def _set_value(self, *args, **kwargs):
523546
# require an arg for each axis and the value
524547
nargs = len(args)
525548
nreq = self._AXIS_LEN + 1
@@ -540,7 +563,7 @@ def set_value(self, *args, **kwargs):
540563
else:
541564
lower = self._get_item_cache(args[0])
542565

543-
lower.set_value(*args[1:], takeable=takeable)
566+
lower._set_value(*args[1:], takeable=takeable)
544567
return self
545568
except KeyError:
546569
axes = self._expand_axes(args)
@@ -553,7 +576,8 @@ def set_value(self, *args, **kwargs):
553576
if made_bigger:
554577
maybe_cast_item(result, args[0], likely_dtype)
555578

556-
return result.set_value(*args)
579+
return result._set_value(*args)
580+
_set_value.__doc__ = set_value.__doc__
557581

558582
def _box_item_values(self, key, values):
559583
if self.ndim == values.ndim:

pandas/core/series.py

+27-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,10 @@ 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+
Please use .at[] or .iat[] accessors.
908+
905909
Parameters
906910
----------
907911
index : label
@@ -911,16 +915,28 @@ def get_value(self, label, takeable=False):
911915
-------
912916
value : scalar value
913917
"""
918+
warnings.warn("get_value is deprecated and will be removed "
919+
"in a future release. Please use "
920+
".at[] or .iat[] accessors instead", FutureWarning,
921+
stacklevel=2)
922+
return self._get_value(label, takeable=takeable)
923+
924+
def _get_value(self, label, takeable=False):
914925
if takeable is True:
915926
return _maybe_box_datetimelike(self._values[label])
916927
return self.index.get_value(self._values, label)
928+
_get_value.__doc__ = get_value.__doc__
917929

918930
def set_value(self, label, value, takeable=False):
919931
"""
920932
Quickly set single value at passed label. If label is not contained, a
921933
new object is created with the label placed at the end of the result
922934
index
923935
936+
.. deprecated:: 0.21.0
937+
938+
Please use .at[] or .iat[] accessors.
939+
924940
Parameters
925941
----------
926942
label : object
@@ -935,17 +951,25 @@ def set_value(self, label, value, takeable=False):
935951
If label is contained, will be reference to calling Series,
936952
otherwise a new object
937953
"""
954+
warnings.warn("set_value is deprecated and will be removed "
955+
"in a future release. Please use "
956+
".at[] or .iat[] accessors instead", FutureWarning,
957+
stacklevel=2)
958+
return self._set_value(label, value, takeable=takeable)
959+
960+
def _set_value(self, label, value, takeable=False):
938961
try:
939962
if takeable:
940963
self._values[label] = value
941964
else:
942965
self.index._engine.set_value(self._values, label, value)
943-
return self
944966
except KeyError:
945967

946968
# set using a non-recursive method
947969
self.loc[label] = value
948-
return self
970+
971+
return self
972+
_set_value.__doc__ = set_value.__doc__
949973

950974
def reset_index(self, level=None, drop=False, name=None, inplace=False):
951975
"""

pandas/core/sparse/frame.py

+41-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,47 @@ 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+
Please use .at[] or .iat[] accessors.
441+
442+
Parameters
443+
----------
444+
index : row label
445+
col : column label
446+
takeable : interpret the index/col as indexers, default False
447+
448+
Returns
449+
-------
450+
value : scalar value
451+
"""
452+
warnings.warn("get_value is deprecated and will be removed "
453+
"in a future release. Please use "
454+
".at[] or .iat[] accessors instead", FutureWarning,
455+
stacklevel=2)
456+
return self._get_value(index, col, takeable=takeable)
457+
458+
def _get_value(self, index, col, takeable=False):
435459
if takeable is True:
436460
series = self._iget_item_cache(col)
437461
else:
438462
series = self._get_item_cache(col)
439463

440-
return series.get_value(index, takeable=takeable)
464+
return series._get_value(index, takeable=takeable)
465+
_get_value.__doc__ = get_value.__doc__
441466

442467
def set_value(self, index, col, value, takeable=False):
443468
"""
444469
Put single value at passed column and index
445470
471+
.. deprecated:: 0.21.0
472+
473+
Please use .at[] or .iat[] accessors.
474+
446475
Parameters
447476
----------
448477
index : row label
@@ -460,9 +489,18 @@ def set_value(self, index, col, value, takeable=False):
460489
-------
461490
frame : DataFrame
462491
"""
463-
dense = self.to_dense().set_value(index, col, value, takeable=takeable)
492+
warnings.warn("set_value is deprecated and will be removed "
493+
"in a future release. Please use "
494+
".at[] or .iat[] accessors instead", FutureWarning,
495+
stacklevel=2)
496+
return self._set_value(index, col, value, takeable=takeable)
497+
498+
def _set_value(self, index, col, value, takeable=False):
499+
dense = self.to_dense()._set_value(
500+
index, col, value, takeable=takeable)
464501
return dense.to_sparse(kind=self._default_kind,
465502
fill_value=self._default_fill_value)
503+
_set_value.__doc__ = set_value.__doc__
466504

467505
def _slice(self, slobj, axis=0, kind=None):
468506
if axis == 0:

0 commit comments

Comments
 (0)