Skip to content

Commit 047e5d7

Browse files
committed
REF: put concatenate_block_managers in internals.concat (pandas-dev#33231)
1 parent c05d28b commit 047e5d7

File tree

3 files changed

+55
-57
lines changed

3 files changed

+55
-57
lines changed

pandas/core/internals/__init__.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,8 @@
1414
_safe_reshape,
1515
make_block,
1616
)
17-
from pandas.core.internals.managers import (
18-
BlockManager,
19-
SingleBlockManager,
20-
concatenate_block_managers,
21-
)
17+
from pandas.core.internals.concat import concatenate_block_managers
18+
from pandas.core.internals.managers import BlockManager, SingleBlockManager
2219

2320
__all__ = [
2421
"Block",

pandas/core/internals/concat.py

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,57 @@
2323
from pandas.core.dtypes.missing import isna
2424

2525
import pandas.core.algorithms as algos
26+
from pandas.core.internals.blocks import make_block
27+
from pandas.core.internals.managers import BlockManager
2628

2729

28-
def get_mgr_concatenation_plan(mgr, indexers):
30+
def concatenate_block_managers(
31+
mgrs_indexers, axes, concat_axis: int, copy: bool
32+
) -> BlockManager:
33+
"""
34+
Concatenate block managers into one.
35+
36+
Parameters
37+
----------
38+
mgrs_indexers : list of (BlockManager, {axis: indexer,...}) tuples
39+
axes : list of Index
40+
concat_axis : int
41+
copy : bool
42+
43+
Returns
44+
-------
45+
BlockManager
46+
"""
47+
concat_plans = [
48+
_get_mgr_concatenation_plan(mgr, indexers) for mgr, indexers in mgrs_indexers
49+
]
50+
concat_plan = _combine_concat_plans(concat_plans, concat_axis)
51+
blocks = []
52+
53+
for placement, join_units in concat_plan:
54+
55+
if len(join_units) == 1 and not join_units[0].indexers:
56+
b = join_units[0].block
57+
values = b.values
58+
if copy:
59+
values = values.copy()
60+
else:
61+
values = values.view()
62+
b = b.make_block_same_class(values, placement=placement)
63+
elif _is_uniform_join_units(join_units):
64+
b = join_units[0].block.concat_same_type([ju.block for ju in join_units])
65+
b.mgr_locs = placement
66+
else:
67+
b = make_block(
68+
_concatenate_join_units(join_units, concat_axis, copy=copy),
69+
placement=placement,
70+
)
71+
blocks.append(b)
72+
73+
return BlockManager(blocks, axes)
74+
75+
76+
def _get_mgr_concatenation_plan(mgr, indexers):
2977
"""
3078
Construct concatenation plan for given block manager and indexers.
3179
@@ -232,7 +280,7 @@ def get_reindexed_values(self, empty_dtype, upcasted_na):
232280
return values
233281

234282

235-
def concatenate_join_units(join_units, concat_axis, copy):
283+
def _concatenate_join_units(join_units, concat_axis, copy):
236284
"""
237285
Concatenate values from several join units along selected axis.
238286
"""
@@ -371,11 +419,11 @@ def _get_empty_dtype_and_na(join_units):
371419
raise AssertionError(msg)
372420

373421

374-
def is_uniform_join_units(join_units) -> bool:
422+
def _is_uniform_join_units(join_units) -> bool:
375423
"""
376424
Check if the join units consist of blocks of uniform type that can
377425
be concatenated using Block.concat_same_type instead of the generic
378-
concatenate_join_units (which uses `concat_compat`).
426+
_concatenate_join_units (which uses `concat_compat`).
379427
380428
"""
381429
return (
@@ -429,7 +477,7 @@ def _trim_join_unit(join_unit, length):
429477
return JoinUnit(block=extra_block, indexers=extra_indexers, shape=extra_shape)
430478

431479

432-
def combine_concat_plans(plans, concat_axis):
480+
def _combine_concat_plans(plans, concat_axis):
433481
"""
434482
Combine multiple concatenation plans into one.
435483

pandas/core/internals/managers.py

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,6 @@
4747
get_block_type,
4848
make_block,
4949
)
50-
from pandas.core.internals.concat import ( # all for concatenate_block_managers
51-
combine_concat_plans,
52-
concatenate_join_units,
53-
get_mgr_concatenation_plan,
54-
is_uniform_join_units,
55-
)
5650

5751
from pandas.io.formats.printing import pprint_thing
5852

@@ -1974,44 +1968,3 @@ def _preprocess_slice_or_indexer(slice_or_indexer, length, allow_fill):
19741968
if not allow_fill:
19751969
indexer = maybe_convert_indices(indexer, length)
19761970
return "fancy", indexer, len(indexer)
1977-
1978-
1979-
def concatenate_block_managers(mgrs_indexers, axes, concat_axis, copy):
1980-
"""
1981-
Concatenate block managers into one.
1982-
1983-
Parameters
1984-
----------
1985-
mgrs_indexers : list of (BlockManager, {axis: indexer,...}) tuples
1986-
axes : list of Index
1987-
concat_axis : int
1988-
copy : bool
1989-
1990-
"""
1991-
concat_plans = [
1992-
get_mgr_concatenation_plan(mgr, indexers) for mgr, indexers in mgrs_indexers
1993-
]
1994-
concat_plan = combine_concat_plans(concat_plans, concat_axis)
1995-
blocks = []
1996-
1997-
for placement, join_units in concat_plan:
1998-
1999-
if len(join_units) == 1 and not join_units[0].indexers:
2000-
b = join_units[0].block
2001-
values = b.values
2002-
if copy:
2003-
values = values.copy()
2004-
else:
2005-
values = values.view()
2006-
b = b.make_block_same_class(values, placement=placement)
2007-
elif is_uniform_join_units(join_units):
2008-
b = join_units[0].block.concat_same_type([ju.block for ju in join_units])
2009-
b.mgr_locs = placement
2010-
else:
2011-
b = make_block(
2012-
concatenate_join_units(join_units, concat_axis, copy=copy),
2013-
placement=placement,
2014-
)
2015-
blocks.append(b)
2016-
2017-
return BlockManager(blocks, axes)

0 commit comments

Comments
 (0)