diff --git a/pandas/core/groupby/generic.py b/pandas/core/groupby/generic.py index 18506b871bda6..dcb962d737903 100644 --- a/pandas/core/groupby/generic.py +++ b/pandas/core/groupby/generic.py @@ -1625,14 +1625,14 @@ def _wrap_transformed_output( def _wrap_agged_manager(self, mgr: Manager2D) -> DataFrame: if not self.as_index: index = np.arange(mgr.shape[1]) - mgr.set_axis(1, ibase.Index(index), verify_integrity=False) + mgr.set_axis(1, ibase.Index(index)) result = self.obj._constructor(mgr) self._insert_inaxis_grouper_inplace(result) result = result._consolidate() else: index = self.grouper.result_index - mgr.set_axis(1, index, verify_integrity=False) + mgr.set_axis(1, index) result = self.obj._constructor(mgr) if self.axis == 1: diff --git a/pandas/core/internals/array_manager.py b/pandas/core/internals/array_manager.py index 71e6d14e6a716..d4dee81bf8081 100644 --- a/pandas/core/internals/array_manager.py +++ b/pandas/core/internals/array_manager.py @@ -160,21 +160,10 @@ def _normalize_axis(axis: int) -> int: axis = 1 if axis == 0 else 0 return axis - def set_axis( - self, axis: int, new_labels: Index, verify_integrity: bool = True - ) -> None: + def set_axis(self, axis: int, new_labels: Index) -> None: # Caller is responsible for ensuring we have an Index object. + self._validate_set_axis(axis, new_labels) axis = self._normalize_axis(axis) - if verify_integrity: - old_len = len(self._axes[axis]) - new_len = len(new_labels) - - if new_len != old_len: - raise ValueError( - f"Length mismatch: Expected axis has {old_len} elements, new " - f"values have {new_len} elements" - ) - self._axes[axis] = new_labels def consolidate(self: T) -> T: diff --git a/pandas/core/internals/base.py b/pandas/core/internals/base.py index 3a8ff8237b62f..f8ccb10655ea1 100644 --- a/pandas/core/internals/base.py +++ b/pandas/core/internals/base.py @@ -44,6 +44,23 @@ def ndim(self) -> int: def shape(self) -> Shape: return tuple(len(ax) for ax in self.axes) + @final + def _validate_set_axis(self, axis: int, new_labels: Index) -> None: + # Caller is responsible for ensuring we have an Index object. + old_len = len(self.axes[axis]) + new_len = len(new_labels) + + if axis == 1 and len(self.items) == 0: + # If we are setting the index on a DataFrame with no columns, + # it is OK to change the length. + pass + + elif new_len != old_len: + raise ValueError( + f"Length mismatch: Expected axis has {old_len} elements, new " + f"values have {new_len} elements" + ) + def reindex_indexer( self: T, new_axis, diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index 73f463997c085..836a903248f1d 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -211,20 +211,9 @@ def _normalize_axis(self, axis: int) -> int: axis = 1 if axis == 0 else 0 return axis - def set_axis( - self, axis: int, new_labels: Index, verify_integrity: bool = True - ) -> None: + def set_axis(self, axis: int, new_labels: Index) -> None: # Caller is responsible for ensuring we have an Index object. - if verify_integrity: - old_len = len(self.axes[axis]) - new_len = len(new_labels) - - if new_len != old_len: - raise ValueError( - f"Length mismatch: Expected axis has {old_len} elements, new " - f"values have {new_len} elements" - ) - + self._validate_set_axis(axis, new_labels) self.axes[axis] = new_labels @property