Skip to content

BUG: concat of ExtensionArray with other dtype fails #20762

Closed
@jorisvandenbossche

Description

@jorisvandenbossche
In [22]: from pandas.tests.extension.decimal.array import DecimalArray, make_data
    ...: dec_arr = DecimalArray(make_data())
    ...: df1 = pd.DataFrame({'ext': dec_arr[:3]})

In [23]: df2 = pd.DataFrame({'ext': [1.0, 2.0]})

In [24]: pd.concat([df1, df2], axis=0)
---------------------------------------------------------------------------
AxisError                                 Traceback (most recent call last)
<ipython-input-24-e046f4a55b52> in <module>()
----> 1 pd.concat([df1, df2], axis=0)

/home/joris/scipy/pandas/pandas/core/reshape/concat.py in concat(objs, axis, join, join_axes, ignore_index, keys, levels, names, verify_integrity, copy)
    211                        verify_integrity=verify_integrity,
    212                        copy=copy)
--> 213     return op.get_result()
    214 
    215 

/home/joris/scipy/pandas/pandas/core/reshape/concat.py in get_result(self)
    406             new_data = concatenate_block_managers(
    407                 mgrs_indexers, self.new_axes, concat_axis=self.axis,
--> 408                 copy=self.copy)
    409             if not self.copy:
    410                 new_data._consolidate_inplace()

/home/joris/scipy/pandas/pandas/core/internals.py in concatenate_block_managers(mgrs_indexers, axes, concat_axis, copy)
   5415             print("--- Using concatenate_join_units")
   5416             b = make_block(
-> 5417                 concatenate_join_units(join_units, concat_axis, copy=copy),
   5418                 placement=placement)
   5419         blocks.append(b)

/home/joris/scipy/pandas/pandas/core/internals.py in concatenate_join_units(join_units, concat_axis, copy)
   5557             concat_values = concat_values.copy()
   5558     else:
-> 5559         concat_values = _concat._concat_compat(to_concat, axis=concat_axis)
   5560 
   5561     return concat_values

/home/joris/scipy/pandas/pandas/core/dtypes/concat.py in _concat_compat(to_concat, axis)
    189                 to_concat = [x.astype('object') for x in to_concat]
    190 
--> 191     return np.concatenate(to_concat, axis=axis)
    192 
    193 

AxisError: axis 1 is out of bounds for array of dimension 1

This is because _concat_compat is not yet aware of extension arrays, and hence does not reshape the extension array object values to 2D (as is done correctly in case of other non-consolidatable blocks like datetimetz)

Metadata

Metadata

Assignees

No one assigned

    Labels

    ExtensionArrayExtending pandas with custom dtypes or arrays.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions