Skip to content

Commit edd9f19

Browse files
committed
ENH: rename DataFrame axes without copying data
1 parent 1ba5625 commit edd9f19

File tree

5 files changed

+46
-16
lines changed

5 files changed

+46
-16
lines changed

Diff for: pandas/core/frame.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -1346,7 +1346,7 @@ def fillna(self, value=None, method='pad'):
13461346
#----------------------------------------------------------------------
13471347
# Rename
13481348

1349-
def rename(self, index=None, columns=None):
1349+
def rename(self, index=None, columns=None, copy=True):
13501350
"""
13511351
Alter index and / or columns using input function or
13521352
functions. Function / dict values must be unique (1-to-1). Labels not
@@ -1358,6 +1358,8 @@ def rename(self, index=None, columns=None):
13581358
Transformation to apply to index values
13591359
columns : dict-like or function, optional
13601360
Transformation to apply to column values
1361+
copy : boolean, default True
1362+
Also copy underlying data
13611363
13621364
See also
13631365
--------
@@ -1390,7 +1392,7 @@ def columns_f(x):
13901392

13911393
self._consolidate_inplace()
13921394

1393-
result = self.copy()
1395+
result = self.copy(deep=copy)
13941396

13951397
if index is not None:
13961398
result._rename_index_inplace(index_f)
@@ -1405,7 +1407,7 @@ def _rename_index_inplace(self, mapper):
14051407
self._series_cache.clear()
14061408

14071409
def _rename_columns_inplace(self, mapper):
1408-
self._data = self._data.rename_items(mapper)
1410+
self._data = self._data.rename_items(mapper, copydata=False)
14091411
self._series_cache.clear()
14101412

14111413
#----------------------------------------------------------------------

Diff for: pandas/core/generic.py

+17-3
Original file line numberDiff line numberDiff line change
@@ -397,9 +397,23 @@ def _values_aggregate(self, func, axis, fill_value, skipna=True):
397397

398398
return result
399399

400-
def copy(self):
401-
"""Make a deep copy of this object"""
402-
return self._constructor(self._data.copy())
400+
def copy(self, deep=True):
401+
"""
402+
Make a copy of this object
403+
404+
Parameters
405+
----------
406+
deep : boolean, default True
407+
Make a deep copy, i.e. also copy data
408+
409+
Returns
410+
-------
411+
copy : type of caller
412+
"""
413+
data = self._data
414+
if deep:
415+
data = data.copy()
416+
return self._constructor(data)
403417

404418
def swaplevel(self, i, j, axis=0):
405419
"""

Diff for: pandas/core/internals.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,11 @@ def shape(self):
8484
def dtype(self):
8585
return self.values.dtype
8686

87-
def copy(self):
88-
return make_block(self.values.copy(), self.items, self.ref_items)
87+
def copy(self, deep=True):
88+
values = self.values
89+
if deep:
90+
values = values.copy()
91+
return make_block(values, self.items, self.ref_items)
8992

9093
def merge(self, other):
9194
assert(self.ref_items.equals(other.ref_items))
@@ -682,13 +685,13 @@ def rename_axis(self, mapper, axis=1):
682685
new_axes[axis] = new_axis
683686
return BlockManager(self.blocks, new_axes)
684687

685-
def rename_items(self, mapper):
688+
def rename_items(self, mapper, copydata=True):
686689
new_items = Index([mapper(x) for x in self.items])
687690
new_items._verify_integrity()
688691

689692
new_blocks = []
690693
for block in self.blocks:
691-
newb = block.copy()
694+
newb = block.copy(deep=copydata)
692695
newb.set_ref_items(new_items, maybe_rename=True)
693696
new_blocks.append(newb)
694697
new_axes = list(self.axes)

Diff for: pandas/core/sparse.py

+12-6
Original file line numberDiff line numberDiff line change
@@ -410,12 +410,15 @@ def astype(self, dtype=None):
410410

411411
return self.copy()
412412

413-
def copy(self):
413+
def copy(self, deep=True):
414414
"""
415415
Make a copy of the SparseSeries. Only the actual sparse values need to
416416
be copied
417417
"""
418-
values = self.sp_values.copy()
418+
if deep:
419+
values = self.sp_values.copy()
420+
else:
421+
values = self.sp_values
419422
return SparseSeries(values, index=self.index,
420423
sparse_index=self.sp_index,
421424
fill_value=self.fill_value)
@@ -775,12 +778,15 @@ def to_dense(self):
775778
data = dict((k, v.to_dense()) for k, v in self.iteritems())
776779
return DataFrame(data, index=self.index)
777780

778-
def copy(self):
781+
def copy(self, deep=True):
779782
"""
780-
Make a deep copy of this SparseDataFrame
783+
Make a copy of this SparseDataFrame
781784
"""
782-
return SparseDataFrame(self._series, index=self.index,
783-
columns=self.columns,
785+
if deep:
786+
series = self._series.copy()
787+
else:
788+
series = self._series
789+
return SparseDataFrame(series, index=self.index, columns=self.columns,
784790
default_fill_value=self.default_fill_value,
785791
default_kind=self.default_kind)
786792

Diff for: pandas/tests/test_frame.py

+5
Original file line numberDiff line numberDiff line change
@@ -2025,6 +2025,11 @@ def test_rename(self):
20252025
renamed = self.frame.T.rename(index={'C' : 'foo', 'D' : 'bar'})
20262026
self.assert_(np.array_equal(renamed.index, ['A', 'B', 'foo', 'bar']))
20272027

2028+
def test_rename_nocopy(self):
2029+
renamed = self.frame.rename(columns={'C' : 'foo'}, copy=False)
2030+
renamed['foo'] = 1.
2031+
self.assert_((self.frame['C'] == 1.).all())
2032+
20282033
#----------------------------------------------------------------------
20292034
# Time series related
20302035

0 commit comments

Comments
 (0)