Skip to content

Commit 6978814

Browse files
authored
REF: put concatenate_block_managers in internals.concat (#33231)
1 parent 8dd3d87 commit 6978814

File tree

3 files changed

+55
-57
lines changed

3 files changed

+55
-57
lines changed

pandas/core/internals/__init__.py

+2-5
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

+53-5
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

-47
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

@@ -2001,44 +1995,3 @@ def _preprocess_slice_or_indexer(slice_or_indexer, length, allow_fill):
20011995
if not allow_fill:
20021996
indexer = maybe_convert_indices(indexer, length)
20031997
return "fancy", indexer, len(indexer)
2004-
2005-
2006-
def concatenate_block_managers(mgrs_indexers, axes, concat_axis, copy):
2007-
"""
2008-
Concatenate block managers into one.
2009-
2010-
Parameters
2011-
----------
2012-
mgrs_indexers : list of (BlockManager, {axis: indexer,...}) tuples
2013-
axes : list of Index
2014-
concat_axis : int
2015-
copy : bool
2016-
2017-
"""
2018-
concat_plans = [
2019-
get_mgr_concatenation_plan(mgr, indexers) for mgr, indexers in mgrs_indexers
2020-
]
2021-
concat_plan = combine_concat_plans(concat_plans, concat_axis)
2022-
blocks = []
2023-
2024-
for placement, join_units in concat_plan:
2025-
2026-
if len(join_units) == 1 and not join_units[0].indexers:
2027-
b = join_units[0].block
2028-
values = b.values
2029-
if copy:
2030-
values = values.copy()
2031-
else:
2032-
values = values.view()
2033-
b = b.make_block_same_class(values, placement=placement)
2034-
elif is_uniform_join_units(join_units):
2035-
b = join_units[0].block.concat_same_type([ju.block for ju in join_units])
2036-
b.mgr_locs = placement
2037-
else:
2038-
b = make_block(
2039-
concatenate_join_units(join_units, concat_axis, copy=copy),
2040-
placement=placement,
2041-
)
2042-
blocks.append(b)
2043-
2044-
return BlockManager(blocks, axes)

0 commit comments

Comments
 (0)