From 1bfc4d8b470b6e7d2171f223c4fea65a5e0c7938 Mon Sep 17 00:00:00 2001 From: Matthew Roeschke <10647082+mroeschke@users.noreply.github.com> Date: Fri, 7 Jun 2024 13:25:42 -0700 Subject: [PATCH] PERF: Use shallow copies/remove unnecessary copies in reshaping --- pandas/core/reshape/melt.py | 4 ++-- pandas/core/reshape/pivot.py | 12 +++++------- pandas/core/reshape/reshape.py | 4 ++-- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/pandas/core/reshape/melt.py b/pandas/core/reshape/melt.py index 294de2cf2fe1d..8756d0ad003d7 100644 --- a/pandas/core/reshape/melt.py +++ b/pandas/core/reshape/melt.py @@ -202,9 +202,9 @@ def melt( if value_vars_was_not_none: frame = frame.iloc[:, algos.unique(idx)] else: - frame = frame.copy() + frame = frame.copy(deep=False) else: - frame = frame.copy() + frame = frame.copy(deep=False) if col_level is not None: # allow list or other? # frame is a copy diff --git a/pandas/core/reshape/pivot.py b/pandas/core/reshape/pivot.py index 8c2c2053b0554..d3d2378fe07fa 100644 --- a/pandas/core/reshape/pivot.py +++ b/pandas/core/reshape/pivot.py @@ -555,8 +555,6 @@ def _all_key(key): piece = piece.T all_key = _all_key(key) - # we are going to mutate this, so need to copy! - piece = piece.copy() piece[all_key] = margin[key] table_pieces.append(piece) @@ -840,11 +838,11 @@ def pivot( # If columns is None we will create a MultiIndex level with None as name # which might cause duplicated names because None is the default for # level names - data = data.copy(deep=False) - data.index = data.index.copy() - data.index.names = [ - name if name is not None else lib.no_default for name in data.index.names - ] + if any(name is None for name in data.index.names): + data = data.copy(deep=False) + data.index.names = [ + name if name is not None else lib.no_default for name in data.index.names + ] indexed: DataFrame | Series if values is lib.no_default: diff --git a/pandas/core/reshape/reshape.py b/pandas/core/reshape/reshape.py index 5426c72a356d6..0f01b7a87dda3 100644 --- a/pandas/core/reshape/reshape.py +++ b/pandas/core/reshape/reshape.py @@ -461,7 +461,7 @@ def _unstack_multiple( ) if isinstance(data, Series): - dummy = data.copy() + dummy = data.copy(deep=False) dummy.index = dummy_index unstacked = dummy.unstack("__placeholder__", fill_value=fill_value, sort=sort) @@ -1025,7 +1025,7 @@ def stack_reshape( buf = [] for idx in stack_cols.unique(): if len(frame.columns) == 1: - data = frame.copy() + data = frame.copy(deep=False) else: if not isinstance(frame.columns, MultiIndex) and not isinstance(idx, tuple): # GH#57750 - if the frame is an Index with tuples, .loc below will fail