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
.