Skip to content

Commit d3c8e87

Browse files
authored
PERF: Series.to_frame (#43558)
1 parent 7073dd1 commit d3c8e87

File tree

4 files changed

+43
-3
lines changed

4 files changed

+43
-3
lines changed

asv_bench/benchmarks/series_methods.py

+13
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,19 @@ def time_constructor(self, data):
2727
Series(data=self.data, index=self.idx)
2828

2929

30+
class ToFrame:
31+
params = [["int64", "datetime64[ns]", "category", "Int64"], [None, "foo"]]
32+
param_names = ["dtype", "name"]
33+
34+
def setup(self, dtype, name):
35+
arr = np.arange(10 ** 5)
36+
ser = Series(arr, dtype=dtype)
37+
self.ser = ser
38+
39+
def time_to_frame(self, dtype, name):
40+
self.ser.to_frame(name)
41+
42+
3043
class NSort:
3144

3245
params = ["first", "last", "all"]

pandas/core/internals/array_manager.py

+9
Original file line numberDiff line numberDiff line change
@@ -1294,6 +1294,15 @@ def set_values(self, values: ArrayLike):
12941294
"""
12951295
self.arrays[0] = values
12961296

1297+
def to_2d_mgr(self, columns: Index) -> ArrayManager:
1298+
"""
1299+
Manager analogue of Series.to_frame
1300+
"""
1301+
arrays = [self.arrays[0]]
1302+
axes = [self.axes[0], columns]
1303+
1304+
return ArrayManager(arrays, axes, verify_integrity=False)
1305+
12971306

12981307
class NullArrayProxy:
12991308
"""

pandas/core/internals/managers.py

+11
Original file line numberDiff line numberDiff line change
@@ -1649,6 +1649,17 @@ def from_array(cls, array: ArrayLike, index: Index) -> SingleBlockManager:
16491649
block = new_block(array, placement=slice(0, len(index)), ndim=1)
16501650
return cls(block, index)
16511651

1652+
def to_2d_mgr(self, columns: Index) -> BlockManager:
1653+
"""
1654+
Manager analogue of Series.to_frame
1655+
"""
1656+
blk = self.blocks[0]
1657+
arr = ensure_block_shape(blk.values, ndim=2)
1658+
bp = BlockPlacement(0)
1659+
new_blk = type(blk)(arr, placement=bp, ndim=2)
1660+
axes = [columns, self.axes[0]]
1661+
return BlockManager([new_blk], axes=axes, verify_integrity=False)
1662+
16521663
def __getstate__(self):
16531664
block_values = [b.values for b in self.blocks]
16541665
block_items = [self.items[b.mgr_locs.indexer] for b in self.blocks]

pandas/core/series.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -1740,12 +1740,19 @@ def to_frame(self, name=None) -> DataFrame:
17401740
1 b
17411741
2 c
17421742
"""
1743+
columns: Index
17431744
if name is None:
1744-
df = self._constructor_expanddim(self)
1745+
name = self.name
1746+
if name is None:
1747+
# default to [0], same as we would get with DataFrame(self)
1748+
columns = ibase.default_index(1)
1749+
else:
1750+
columns = Index([name])
17451751
else:
1746-
df = self._constructor_expanddim({name: self})
1752+
columns = Index([name])
17471753

1748-
return df
1754+
mgr = self._mgr.to_2d_mgr(columns)
1755+
return self._constructor_expanddim(mgr)
17491756

17501757
def _set_name(self, name, inplace=False) -> Series:
17511758
"""

0 commit comments

Comments
 (0)