Skip to content

Commit d3f0e9a

Browse files
authored
DEPR: deprecate Index.holds_integer (#50243)
1 parent 575dc38 commit d3f0e9a

File tree

5 files changed

+33
-9
lines changed

5 files changed

+33
-9
lines changed

doc/source/whatsnew/v2.0.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,7 @@ Deprecations
576576
- :meth:`Index.is_boolean` has been deprecated. Use :func:`pandas.api.types.is_bool_dtype` instead (:issue:`50042`)
577577
- :meth:`Index.is_integer` has been deprecated. Use :func:`pandas.api.types.is_integer_dtype` instead (:issue:`50042`)
578578
- :meth:`Index.is_floating` has been deprecated. Use :func:`pandas.api.types.is_float_dtype` instead (:issue:`50042`)
579+
- :meth:`Index.holds_integer` has been deprecated. Use :func:`pandas.api.types.infer_dtype` instead (:issue:`50243`)
579580

580581
.. ---------------------------------------------------------------------------
581582
.. _whatsnew_200.prior_deprecations:

pandas/core/indexes/base.py

+18-2
Original file line numberDiff line numberDiff line change
@@ -2487,12 +2487,28 @@ def is_interval(self) -> bool:
24872487
return self.inferred_type in ["interval"]
24882488

24892489
@final
2490-
def holds_integer(self) -> bool:
2490+
def _holds_integer(self) -> bool:
24912491
"""
24922492
Whether the type is an integer type.
24932493
"""
24942494
return self.inferred_type in ["integer", "mixed-integer"]
24952495

2496+
@final
2497+
def holds_integer(self) -> bool:
2498+
"""
2499+
Whether the type is an integer type.
2500+
2501+
.. deprecated:: 2.0.0
2502+
Use `pandas.api.types.infer_dtype` instead
2503+
"""
2504+
warnings.warn(
2505+
f"{type(self).__name__}.holds_integer is deprecated. "
2506+
"Use pandas.api.types.infer_dtype instead.",
2507+
FutureWarning,
2508+
stacklevel=find_stack_level(),
2509+
)
2510+
return self._holds_integer()
2511+
24962512
@cache_readonly
24972513
def inferred_type(self) -> str_t:
24982514
"""
@@ -5537,7 +5553,7 @@ def _should_fallback_to_positional(self) -> bool:
55375553
"""
55385554
Should an integer key be treated as positional?
55395555
"""
5540-
return not self.holds_integer()
5556+
return not self._holds_integer()
55415557

55425558
_index_shared_docs[
55435559
"get_indexer_non_unique"

pandas/plotting/_core.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -940,15 +940,15 @@ def __call__(self, *args, **kwargs):
940940
f"{kind} requires either y column or 'subplots=True'"
941941
)
942942
if y is not None:
943-
if is_integer(y) and not data.columns.holds_integer():
943+
if is_integer(y) and not data.columns._holds_integer():
944944
y = data.columns[y]
945945
# converted to series actually. copy to not modify
946946
data = data[y].copy()
947947
data.index.name = y
948948
elif isinstance(data, ABCDataFrame):
949949
data_cols = data.columns
950950
if x is not None:
951-
if is_integer(x) and not data.columns.holds_integer():
951+
if is_integer(x) and not data.columns._holds_integer():
952952
x = data_cols[x]
953953
elif not isinstance(data[x], ABCSeries):
954954
raise ValueError("x must be a label or position")
@@ -957,7 +957,7 @@ def __call__(self, *args, **kwargs):
957957
# check if we have y as int or list of ints
958958
int_ylist = is_list_like(y) and all(is_integer(c) for c in y)
959959
int_y_arg = is_integer(y) or int_ylist
960-
if int_y_arg and not data.columns.holds_integer():
960+
if int_y_arg and not data.columns._holds_integer():
961961
y = data_cols[y]
962962

963963
label_kw = kwargs["label"] if "label" in kwargs else False

pandas/plotting/_matplotlib/core.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -1137,9 +1137,9 @@ def __init__(self, data, x, y, **kwargs) -> None:
11371137
MPLPlot.__init__(self, data, **kwargs)
11381138
if x is None or y is None:
11391139
raise ValueError(self._kind + " requires an x and y column")
1140-
if is_integer(x) and not self.data.columns.holds_integer():
1140+
if is_integer(x) and not self.data.columns._holds_integer():
11411141
x = self.data.columns[x]
1142-
if is_integer(y) and not self.data.columns.holds_integer():
1142+
if is_integer(y) and not self.data.columns._holds_integer():
11431143
y = self.data.columns[y]
11441144

11451145
# Scatter plot allows to plot objects data
@@ -1196,7 +1196,7 @@ def __init__(self, data, x, y, s=None, c=None, **kwargs) -> None:
11961196
elif is_hashable(s) and s in data.columns:
11971197
s = data[s]
11981198
super().__init__(data, x, y, s=s, **kwargs)
1199-
if is_integer(c) and not self.data.columns.holds_integer():
1199+
if is_integer(c) and not self.data.columns._holds_integer():
12001200
c = self.data.columns[c]
12011201
self.c = c
12021202

@@ -1291,7 +1291,7 @@ def _kind(self) -> Literal["hexbin"]:
12911291

12921292
def __init__(self, data, x, y, C=None, **kwargs) -> None:
12931293
super().__init__(data, x, y, **kwargs)
1294-
if is_integer(C) and not self.data.columns.holds_integer():
1294+
if is_integer(C) and not self.data.columns._holds_integer():
12951295
C = self.data.columns[C]
12961296
self.C = C
12971297

pandas/tests/indexes/common.py

+7
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,13 @@ def test_is_integer_is_deprecated(self, simple_index):
815815
with tm.assert_produces_warning(FutureWarning):
816816
idx.is_integer()
817817

818+
def test_holds_integer_deprecated(self, simple_index):
819+
# GH50243
820+
idx = simple_index
821+
msg = f"{type(idx).__name__}.holds_integer is deprecated. "
822+
with tm.assert_produces_warning(FutureWarning, match=msg):
823+
idx.holds_integer()
824+
818825

819826
class NumericBase(Base):
820827
"""

0 commit comments

Comments
 (0)