diff --git a/pandas/core/frame.py b/pandas/core/frame.py index f515b57e24cfa..61715397e8e0b 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -3599,7 +3599,7 @@ def align( see_also_sub=" or columns", ) @Appender(NDFrame.set_axis.__doc__) - def set_axis(self, labels, axis=0, inplace=False): + def set_axis(self, labels, axis: Axis = 0, inplace: bool = False): return super().set_axis(labels, axis=axis, inplace=inplace) @Substitution(**_shared_doc_kwargs) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 25770c2c6470c..890c0540d9851 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -520,7 +520,7 @@ def _obj_with_exclusions(self: FrameOrSeries) -> FrameOrSeries: """ internal compat with SelectionMixin """ return self - def set_axis(self, labels, axis=0, inplace=False): + def set_axis(self, labels, axis: Axis = 0, inplace: bool = False): """ Assign desired index to given axis. @@ -561,7 +561,8 @@ def set_axis(self, labels, axis=0, inplace=False): obj.set_axis(labels, axis=axis, inplace=True) return obj - def _set_axis(self, axis, labels) -> None: + def _set_axis(self, axis: int, labels: Index) -> None: + labels = ensure_index(labels) self._data.set_axis(axis, labels) self._clear_item_cache() diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index e397167e4881f..9c90b20fc0f16 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -164,15 +164,15 @@ def __nonzero__(self): __bool__ = __nonzero__ @property - def shape(self): + def shape(self) -> Tuple[int, ...]: return tuple(len(ax) for ax in self.axes) @property def ndim(self) -> int: return len(self.axes) - def set_axis(self, axis, new_labels): - new_labels = ensure_index(new_labels) + def set_axis(self, axis: int, new_labels: Index): + # Caller is responsible for ensuring we have an Index object. old_len = len(self.axes[axis]) new_len = len(new_labels) @@ -184,7 +184,9 @@ def set_axis(self, axis, new_labels): self.axes[axis] = new_labels - def rename_axis(self, mapper, axis, copy: bool = True, level=None): + def rename_axis( + self, mapper, axis: int, copy: bool = True, level=None + ) -> "BlockManager": """ Rename one of axes. @@ -193,7 +195,7 @@ def rename_axis(self, mapper, axis, copy: bool = True, level=None): mapper : unary callable axis : int copy : bool, default True - level : int, default None + level : int or None, default None """ obj = self.copy(deep=copy) obj.set_axis(axis, _transform_index(self.axes[axis], mapper, level)) @@ -233,7 +235,7 @@ def _rebuild_blknos_and_blklocs(self): self._blklocs = new_blklocs @property - def items(self): + def items(self) -> Index: return self.axes[0] def _get_counts(self, f): @@ -623,7 +625,7 @@ def comp(s, regex=False): bm._consolidate_inplace() return bm - def is_consolidated(self): + def is_consolidated(self) -> bool: """ Return True if more than one block with the same dtype """ @@ -688,7 +690,7 @@ def get_numeric_data(self, copy: bool = False): self._consolidate_inplace() return self.combine([b for b in self.blocks if b.is_numeric], copy) - def combine(self, blocks, copy=True): + def combine(self, blocks: List[Block], copy: bool = True) -> "BlockManager": """ return a new manager with the blocks """ if len(blocks) == 0: return self.make_empty() @@ -992,7 +994,6 @@ def delete(self, item): self.blocks = tuple( b for blkno, b in enumerate(self.blocks) if not is_blk_deleted[blkno] ) - self._shape = None self._rebuild_blknos_and_blklocs() def set(self, item, value): @@ -1160,7 +1161,6 @@ def insert(self, loc: int, item, value, allow_duplicates: bool = False): self.axes[0] = new_axis self.blocks += (block,) - self._shape = None self._known_consolidated = False diff --git a/pandas/core/series.py b/pandas/core/series.py index d984225f8fd89..d565cbbdd5344 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -9,7 +9,6 @@ TYPE_CHECKING, Any, Callable, - Hashable, Iterable, List, Optional, @@ -23,7 +22,7 @@ from pandas._config import get_option from pandas._libs import lib, properties, reshape, tslibs -from pandas._typing import Label +from pandas._typing import Axis, DtypeObj, Label from pandas.compat.numpy import function as nv from pandas.util._decorators import Appender, Substitution, doc from pandas.util._validators import validate_bool_kwarg, validate_percentile @@ -177,7 +176,7 @@ class Series(base.IndexOpsMixin, generic.NDFrame): _typ = "series" - _name: Optional[Hashable] + _name: Label _metadata: List[str] = ["name"] _internal_names_set = {"index"} | generic.NDFrame._internal_names_set _accessors = {"dt", "cat", "str", "sparse"} @@ -391,9 +390,12 @@ def _can_hold_na(self): _index = None - def _set_axis(self, axis, labels, fastpath: bool = False) -> None: + def _set_axis(self, axis: int, labels, fastpath: bool = False) -> None: """ Override generic, we want to set the _typ here. + + This is called from the cython code when we set the `index` attribute + directly, e.g. `series.index = [1, 2, 3]`. """ if not fastpath: labels = ensure_index(labels) @@ -413,6 +415,7 @@ def _set_axis(self, axis, labels, fastpath: bool = False) -> None: object.__setattr__(self, "_index", labels) if not fastpath: + # The ensure_index call aabove ensures we have an Index object self._data.set_axis(axis, labels) def _update_inplace(self, result, **kwargs): @@ -421,25 +424,25 @@ def _update_inplace(self, result, **kwargs): # ndarray compatibility @property - def dtype(self): + def dtype(self) -> DtypeObj: """ Return the dtype object of the underlying data. """ return self._data.dtype @property - def dtypes(self): + def dtypes(self) -> DtypeObj: """ Return the dtype object of the underlying data. """ return self._data.dtype @property - def name(self) -> Optional[Hashable]: + def name(self) -> Label: return self._name @name.setter - def name(self, value: Optional[Hashable]) -> None: + def name(self, value: Label) -> None: if not is_hashable(value): raise TypeError("Series.name must be a hashable type") object.__setattr__(self, "_name", value) @@ -689,7 +692,7 @@ def __array_ufunc__( inputs = tuple(extract_array(x, extract_numpy=True) for x in inputs) result = getattr(ufunc, method)(*inputs, **kwargs) - name: Optional[Hashable] + name: Label if len(set(names)) == 1: name = names[0] else: @@ -3983,7 +3986,7 @@ def rename( see_also_sub="", ) @Appender(generic.NDFrame.set_axis.__doc__) - def set_axis(self, labels, axis=0, inplace=False): + def set_axis(self, labels, axis: Axis = 0, inplace: bool = False): return super().set_axis(labels, axis=axis, inplace=inplace) @Substitution(**_shared_doc_kwargs)