Skip to content

Commit 46adc5b

Browse files
DEPR: deprecate get_values (#26409)
1 parent d054c03 commit 46adc5b

File tree

28 files changed

+149
-49
lines changed

28 files changed

+149
-49
lines changed

doc/source/whatsnew/v0.25.0.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,9 @@ Other deprecations
615615
Use the public attributes :attr:`~RangeIndex.start`, :attr:`~RangeIndex.stop` and :attr:`~RangeIndex.step` instead (:issue:`26581`).
616616
- The :meth:`Series.ftype`, :meth:`Series.ftypes` and :meth:`DataFrame.ftypes` methods are deprecated and will be removed in a future version.
617617
Instead, use :meth:`Series.dtype` and :meth:`DataFrame.dtypes` (:issue:`26705`).
618+
- The :meth:`Series.get_values`, :meth:`DataFrame.get_values`, :meth:`Index.get_values`,
619+
:meth:`SparseArray.get_values` and :meth:`Categorical.get_values` methods are deprecated.
620+
One of ``np.asarray(..)`` or :meth:`~Series.to_numpy` can be used instead (:issue:`19617`).
618621
- :meth:`Timedelta.resolution` is deprecated and replaced with :meth:`Timedelta.resolution_string`. In a future version, :meth:`Timedelta.resolution` will be changed to behave like the standard library :attr:`timedelta.resolution` (:issue:`21344`)
619622
- :func:`read_table` has been undeprecated. (:issue:`25220`)
620623
- :attr:`Index.dtype_str` is deprecated. (:issue:`18262`)

pandas/_libs/lib.pyx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,10 @@ def values_from_object(obj: object):
7676
""" return my values or the object if we are say an ndarray """
7777
func: object
7878

79-
func = getattr(obj, 'get_values', None)
79+
if getattr(obj, '_typ', '') == 'dataframe':
80+
return obj.values
81+
82+
func = getattr(obj, '_internal_get_values', None)
8083
if func is not None:
8184
obj = func()
8285

pandas/_libs/src/ujson/python/objToJSON.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,9 +269,19 @@ static PyObject *get_values(PyObject *obj) {
269269
}
270270
}
271271

272-
if (!values && PyObject_HasAttrString(obj, "get_values")) {
272+
if (!values && PyObject_HasAttrString(obj, "_internal_get_values")) {
273273
PRINTMARK();
274-
values = PyObject_CallMethod(obj, "get_values", NULL);
274+
values = PyObject_CallMethod(obj, "_internal_get_values", NULL);
275+
if (values && !PyArray_CheckExact(values)) {
276+
PRINTMARK();
277+
Py_DECREF(values);
278+
values = NULL;
279+
}
280+
}
281+
282+
if (!values && PyObject_HasAttrString(obj, "get_block_values")) {
283+
PRINTMARK();
284+
values = PyObject_CallMethod(obj, "get_block_values", NULL);
275285
if (values && !PyArray_CheckExact(values)) {
276286
PRINTMARK();
277287
Py_DECREF(values);

pandas/core/algorithms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1590,7 +1590,7 @@ def take_nd(arr, indexer, axis=0, out=None, fill_value=np.nan, mask_info=None,
15901590
return arr.take(indexer, fill_value=fill_value, allow_fill=allow_fill)
15911591

15921592
if is_sparse(arr):
1593-
arr = arr.get_values()
1593+
arr = arr.to_dense()
15941594
elif isinstance(arr, (ABCIndexClass, ABCSeries)):
15951595
arr = arr.values
15961596

pandas/core/arrays/categorical.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1483,6 +1483,8 @@ def get_values(self):
14831483
"""
14841484
Return the values.
14851485
1486+
.. deprecated:: 0.25.0
1487+
14861488
For internal compatibility with pandas formatting.
14871489
14881490
Returns
@@ -1491,6 +1493,11 @@ def get_values(self):
14911493
A numpy array of the same dtype as categorical.categories.dtype or
14921494
Index if datetime / periods.
14931495
"""
1496+
warn("The 'get_values' method is deprecated and will be removed in a "
1497+
"future version", FutureWarning, stacklevel=2)
1498+
return self._internal_get_values()
1499+
1500+
def _internal_get_values(self):
14941501
# if we are a datetime and period index, return Index to keep metadata
14951502
if is_datetimelike(self.categories):
14961503
return self.categories.take(self._codes, fill_value=np.nan)
@@ -1923,7 +1930,7 @@ def __iter__(self):
19231930
"""
19241931
Returns an Iterator over the values of this Categorical.
19251932
"""
1926-
return iter(self.get_values().tolist())
1933+
return iter(self._internal_get_values().tolist())
19271934

19281935
def __contains__(self, key):
19291936
"""

pandas/core/arrays/sparse.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ def _sparse_array_op(
454454

455455
if left.sp_index.ngaps == 0 or right.sp_index.ngaps == 0:
456456
with np.errstate(all='ignore'):
457-
result = op(left.get_values(), right.get_values())
457+
result = op(left.to_dense(), right.to_dense())
458458
fill = op(_get_fill(left), _get_fill(right))
459459

460460
if left.sp_index.ngaps == 0:
@@ -1468,8 +1468,21 @@ def to_dense(self):
14681468
"""
14691469
return np.asarray(self, dtype=self.sp_values.dtype)
14701470

1471-
# TODO: Look into deprecating this in favor of `to_dense`.
1472-
get_values = to_dense
1471+
def get_values(self):
1472+
"""
1473+
Convert SparseArray to a NumPy array.
1474+
1475+
.. deprecated:: 0.25.0
1476+
Use `to_dense` instead.
1477+
1478+
"""
1479+
warnings.warn(
1480+
"The 'get_values' method is deprecated and will be removed in a "
1481+
"future version. Use the 'to_dense' method instead.",
1482+
FutureWarning, stacklevel=2)
1483+
return self._internal_get_values()
1484+
1485+
_internal_get_values = to_dense
14731486

14741487
# ------------------------------------------------------------------------
14751488
# IO

pandas/core/dtypes/concat.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ def _concat_categorical(to_concat, axis=0):
194194
return union_categoricals(categoricals)
195195

196196
# extract the categoricals & coerce to object if needed
197-
to_concat = [x.get_values() if is_categorical_dtype(x.dtype)
197+
to_concat = [x._internal_get_values() if is_categorical_dtype(x.dtype)
198198
else np.asarray(x).ravel() if not is_datetime64tz_dtype(x)
199199
else np.asarray(x.astype(object)) for x in to_concat]
200200
result = _concat_compat(to_concat)

pandas/core/frame.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1616,7 +1616,8 @@ def to_records(self, index=True, convert_datetime64=None,
16161616
else:
16171617
ix_vals = [self.index.values]
16181618

1619-
arrays = ix_vals + [self[c].get_values() for c in self.columns]
1619+
arrays = ix_vals + [self[c]._internal_get_values()
1620+
for c in self.columns]
16201621

16211622
count = 0
16221623
index_names = list(self.index.names)
@@ -1632,7 +1633,7 @@ def to_records(self, index=True, convert_datetime64=None,
16321633
names = [str(name) for name in itertools.chain(index_names,
16331634
self.columns)]
16341635
else:
1635-
arrays = [self[c].get_values() for c in self.columns]
1636+
arrays = [self[c]._internal_get_values() for c in self.columns]
16361637
names = [str(c) for c in self.columns]
16371638
index_names = []
16381639

pandas/core/generic.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5220,6 +5220,9 @@ def get_values(self):
52205220
"""
52215221
Return an ndarray after converting sparse values to dense.
52225222
5223+
.. deprecated:: 0.25.0
5224+
Use ``np.asarray(..)`` or :meth:`DataFrame.values` instead.
5225+
52235226
This is the same as ``.values`` for non-sparse data. For sparse
52245227
data contained in a `SparseArray`, the data are first
52255228
converted to a dense representation.
@@ -5259,6 +5262,13 @@ def get_values(self):
52595262
[nan, 2.],
52605263
[nan, 3.]])
52615264
"""
5265+
warnings.warn(
5266+
"The 'get_values' method is deprecated and will be removed in a "
5267+
"future version. Use '.values' or 'np.asarray(..)' instead.",
5268+
FutureWarning, stacklevel=2)
5269+
return self._internal_get_values()
5270+
5271+
def _internal_get_values(self):
52625272
return self.values
52635273

52645274
def get_dtype_counts(self):

pandas/core/groupby/generic.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,7 +1118,7 @@ def nunique(self, dropna=True):
11181118
"""
11191119
ids, _, _ = self.grouper.group_info
11201120

1121-
val = self.obj.get_values()
1121+
val = self.obj._internal_get_values()
11221122

11231123
try:
11241124
sorter = np.lexsort((val, ids))
@@ -1192,7 +1192,7 @@ def value_counts(self, normalize=False, sort=True, ascending=False,
11921192
bins=bins)
11931193

11941194
ids, _, _ = self.grouper.group_info
1195-
val = self.obj.get_values()
1195+
val = self.obj._internal_get_values()
11961196

11971197
# groupby removes null keys from groupings
11981198
mask = ids != -1
@@ -1306,7 +1306,7 @@ def count(self):
13061306
Count of values within each group.
13071307
"""
13081308
ids, _, ngroups = self.grouper.group_info
1309-
val = self.obj.get_values()
1309+
val = self.obj._internal_get_values()
13101310

13111311
mask = (ids != -1) & ~isna(val)
13121312
ids = ensure_platform_int(ids)

pandas/core/indexes/base.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3764,6 +3764,9 @@ def get_values(self):
37643764
"""
37653765
Return `Index` data as an `numpy.ndarray`.
37663766
3767+
.. deprecated:: 0.25.0
3768+
Use :meth:`Index.to_numpy` or :attr:`Index.array` instead.
3769+
37673770
Returns
37683771
-------
37693772
numpy.ndarray
@@ -3802,6 +3805,13 @@ def get_values(self):
38023805
>>> midx.get_values().ndim
38033806
1
38043807
"""
3808+
warnings.warn(
3809+
"The 'get_values' method is deprecated and will be removed in a "
3810+
"future version. Use '.to_numpy()' or '.array' instead.",
3811+
FutureWarning, stacklevel=2)
3812+
return self._internal_get_values()
3813+
3814+
def _internal_get_values(self):
38053815
return self.values
38063816

38073817
@Appender(IndexOpsMixin.memory_usage.__doc__)

pandas/core/indexes/category.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -355,9 +355,10 @@ def _wrap_setop_result(self, other, result):
355355
name = get_op_result_name(self, other)
356356
return self._shallow_copy(result, name=name)
357357

358-
def get_values(self):
359-
""" return the underlying data as an ndarray """
360-
return self._data.get_values()
358+
def _internal_get_values(self):
359+
# override base Index version to get the numpy array representation of
360+
# the underlying Categorical
361+
return self._data._internal_get_values()
361362

362363
def tolist(self):
363364
return self._data.tolist()

pandas/core/indexes/multi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1246,7 +1246,7 @@ def values(self):
12461246
for i in range(self.nlevels):
12471247
vals = self._get_level_values(i)
12481248
if is_categorical_dtype(vals):
1249-
vals = vals.get_values()
1249+
vals = vals._internal_get_values()
12501250
if (isinstance(vals.dtype, ExtensionDtype)
12511251
or hasattr(vals, '_box_values')):
12521252
vals = vals.astype(object)

pandas/core/internals/blocks.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,12 @@ def get_values(self, dtype=None):
177177
return self.values.astype(object)
178178
return self.values
179179

180+
def get_block_values(self, dtype=None):
181+
"""
182+
This is used in the JSON C code
183+
"""
184+
return self.get_values(dtype=dtype)
185+
180186
def to_dense(self):
181187
return self.values.view()
182188

@@ -2921,7 +2927,7 @@ def to_dense(self):
29212927
# Categorical.get_values returns a DatetimeIndex for datetime
29222928
# categories, so we can't simply use `np.asarray(self.values)` like
29232929
# other types.
2924-
return self.values.get_values()
2930+
return self.values._internal_get_values()
29252931

29262932
def to_native_types(self, slicer=None, na_rep='', quoting=None, **kwargs):
29272933
""" convert to our native types format, slicing if desired """
@@ -3222,7 +3228,7 @@ def _putmask_preserve(nv, n):
32223228
dtype, _ = maybe_promote(n.dtype)
32233229

32243230
if is_extension_type(v.dtype) and is_object_dtype(dtype):
3225-
v = v.get_values(dtype)
3231+
v = v._internal_get_values(dtype)
32263232
else:
32273233
v = v.astype(dtype)
32283234

pandas/core/ops.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1891,7 +1891,7 @@ def wrapper(self, other, axis=None):
18911891
name=res_name, dtype='bool')
18921892

18931893
else:
1894-
values = self.get_values()
1894+
values = self.to_numpy()
18951895

18961896
with np.errstate(all='ignore'):
18971897
res = na_op(values, other)

pandas/core/series.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,11 +506,21 @@ def get_values(self):
506506
"""
507507
Same as values (but handles sparseness conversions); is a view.
508508
509+
.. deprecated:: 0.25.0
510+
Use :meth:`Series.to_numpy` or :attr:`Series.array` instead.
511+
509512
Returns
510513
-------
511514
numpy.ndarray
512515
Data of the Series.
513516
"""
517+
warnings.warn(
518+
"The 'get_values' method is deprecated and will be removed in a "
519+
"future version. Use '.to_numpy()' or '.array' instead.",
520+
FutureWarning, stacklevel=2)
521+
return self._internal_get_values()
522+
523+
def _internal_get_values(self):
514524
return self._data.get_values()
515525

516526
@property

pandas/core/sparse/frame.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,7 @@ def xs(self, key, axis=0, copy=False):
493493
return data
494494

495495
i = self.index.get_loc(key)
496-
data = self.take([i]).get_values()[0]
496+
data = self.take([i])._internal_get_values()[0]
497497
return Series(data, index=self.columns)
498498

499499
# ----------------------------------------------------------------------
@@ -694,9 +694,10 @@ def _reindex_with_indexers(self, reindexers, method=None, fill_value=None,
694694
if col not in self:
695695
continue
696696
if row_indexer is not None:
697-
new_arrays[col] = algos.take_1d(self[col].get_values(),
698-
row_indexer,
699-
fill_value=fill_value)
697+
new_arrays[col] = algos.take_1d(
698+
self[col]._internal_get_values(),
699+
row_indexer,
700+
fill_value=fill_value)
700701
else:
701702
new_arrays[col] = self[col]
702703

pandas/core/sparse/series.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ def __repr__(self):
224224
def _reduce(self, op, name, axis=0, skipna=True, numeric_only=None,
225225
filter_type=None, **kwds):
226226
""" perform a reduction operation """
227-
return op(self.get_values(), skipna=skipna, **kwds)
227+
return op(self.array.to_dense(), skipna=skipna, **kwds)
228228

229229
def __getstate__(self):
230230
# pickling

pandas/io/formats/format.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ def _get_footer(self):
129129
return str(footer)
130130

131131
def _get_formatted_values(self):
132-
return format_array(self.categorical.get_values(), None,
132+
return format_array(self.categorical._internal_get_values(), None,
133133
float_format=None, na_rep=self.na_rep)
134134

135135
def to_string(self):
@@ -1196,7 +1196,7 @@ def _format_strings(self):
11961196

11971197
if is_categorical_dtype(values.dtype):
11981198
# Categorical is special for now, so that we can preserve tzinfo
1199-
array = values.get_values()
1199+
array = values._internal_get_values()
12001200
else:
12011201
array = np.asarray(values)
12021202

0 commit comments

Comments
 (0)