Why is pd.Index.union not commutative? · Issue #23525 · pandas-dev/pandas (original) (raw)

Code Sample, a copy-pastable example if possible

ix = pd.Index([1,2]) eix = pd.Index([]) pi = pd.PeriodIndex(['19910905', '19910906'], freq='D')

Pair 1

pi.union(eix) ValueError: can only call with other PeriodIndex-ed objects eix.union(pi) PeriodIndex(['1991-09-05', '1991-09-06'], dtype='period[D]', freq='D')

Pair 2

pi.union(ix) ValueError: can only call with other PeriodIndex-ed objects ix.union(pi) Index([1, 2, 1991-09-05, 1991-09-06], dtype='object')

Problem description

Conceptually I would imagine a union operation to be commutative. I was just wondering if there was an deliberate rationale behind not implementing pd.Index._assert_can_do_setop to only fail if the complementary self._assert_can_do_setop also fails.

This behavior also leads to some unexpected behaviors in pd.concat. For example:

>>> df1 = df1 = pd.DataFrame([[1,2,3],[1,2,3]], index=pd.PeriodIndex(['19910905', '19910906'], freq='D'))
>>> df2 = pd.DataFrame()
>>> pd.concat([df1, df2], axis=1, keys=['a', 'b'])
ValueError: can only call with other PeriodIndex-ed objects
>>> pd.concat([df2, df1], axis=1, keys=['a', 'b'])
Works!

Additionally (and perhaps this should be raised as a separate issue) should the specific implementation of pd.PeriodIndex._assert_can_do_setop not raise if the other index is empty? Since pd.Index([]).union(<instance of pd.PeriodIndex>) results in an instance of pd.PeriodIndex.