33"""
44
55from collections import abc
6- from typing import Iterable , List , Mapping , Union , overload
6+ from typing import TYPE_CHECKING , Iterable , List , Mapping , Union , overload
77
88import numpy as np
99
1212from pandas .core .dtypes .concat import concat_compat
1313from pandas .core .dtypes .generic import ABCDataFrame , ABCSeries
1414
15- from pandas import DataFrame , Index , MultiIndex , Series
1615from pandas .core .arrays .categorical import (
1716 factorize_from_iterable ,
1817 factorize_from_iterables ,
1918)
2019import pandas .core .common as com
21- from pandas .core .generic import NDFrame
2220from pandas .core .indexes .api import (
21+ Index ,
22+ MultiIndex ,
2323 all_indexes_same ,
2424 ensure_index ,
2525 get_consensus_names ,
2828import pandas .core .indexes .base as ibase
2929from pandas .core .internals import concatenate_block_managers
3030
31+ if TYPE_CHECKING :
32+ from pandas import DataFrame
33+
3134# ---------------------------------------------------------------------
3235# Concatenate DataFrame objects
3336
@@ -291,7 +294,7 @@ class _Concatenator:
291294
292295 def __init__ (
293296 self ,
294- objs ,
297+ objs : Union [ Iterable [ FrameOrSeries ], Mapping [ Label , FrameOrSeries ]] ,
295298 axis = 0 ,
296299 join : str = "outer" ,
297300 keys = None ,
@@ -302,7 +305,7 @@ def __init__(
302305 copy : bool = True ,
303306 sort = False ,
304307 ):
305- if isinstance (objs , (NDFrame , str )):
308+ if isinstance (objs , (ABCSeries , ABCDataFrame , str )):
306309 raise TypeError (
307310 "first argument must be an iterable of pandas "
308311 f'objects, you passed an object of type "{ type (objs ).__name__ } "'
@@ -348,7 +351,7 @@ def __init__(
348351 # consolidate data & figure out what our result ndim is going to be
349352 ndims = set ()
350353 for obj in objs :
351- if not isinstance (obj , (Series , DataFrame )):
354+ if not isinstance (obj , (ABCSeries , ABCDataFrame )):
352355 msg = (
353356 f"cannot concatenate object of type '{ type (obj )} '; "
354357 "only Series and DataFrame objs are valid"
@@ -374,7 +377,7 @@ def __init__(
374377 # filter out the empties if we have not multi-index possibilities
375378 # note to keep empty Series as it affect to result columns / name
376379 non_empties = [
377- obj for obj in objs if sum (obj .shape ) > 0 or isinstance (obj , Series )
380+ obj for obj in objs if sum (obj .shape ) > 0 or isinstance (obj , ABCSeries )
378381 ]
379382
380383 if len (non_empties ) and (
@@ -388,15 +391,15 @@ def __init__(
388391 self .objs = objs
389392
390393 # Standardize axis parameter to int
391- if isinstance (sample , Series ):
392- axis = DataFrame ._get_axis_number (axis )
394+ if isinstance (sample , ABCSeries ):
395+ axis = sample . _constructor_expanddim ._get_axis_number (axis )
393396 else :
394397 axis = sample ._get_axis_number (axis )
395398
396399 # Need to flip BlockManager axis in the DataFrame special case
397400 self ._is_frame = isinstance (sample , ABCDataFrame )
398401 if self ._is_frame :
399- axis = DataFrame ._get_block_manager_axis (axis )
402+ axis = sample ._get_block_manager_axis (axis )
400403
401404 self ._is_series = isinstance (sample , ABCSeries )
402405 if not 0 <= axis <= sample .ndim :
@@ -543,7 +546,7 @@ def _get_concat_axis(self) -> Index:
543546 num = 0
544547 has_names = False
545548 for i , x in enumerate (self .objs ):
546- if not isinstance (x , Series ):
549+ if not isinstance (x , ABCSeries ):
547550 raise TypeError (
548551 f"Cannot concatenate type 'Series' with "
549552 f"object of type '{ type (x ).__name__ } '"
0 commit comments