Open
Description
I assumed that in eg get_level_values
, stack
, unstack
, ... (which all boil down to the behaviour of _get_level_number
) using an integer to specify the level, would always mean positional because we have no way to disambiguate between position or name in those cases.
But, this seems very inconsistent:
In [40]: mi = pd.MultiIndex.from_product([[0, 1], [2, 3], [4, 5]], names=[1, 1, 2])
In [41]: mi._get_level_number(0) # <--- positional
Out[41]: 0
In [43]: mi._get_level_number(1) # <--- positional (as name should raise an error given duplicates)
Out[43]: 1
In [44]: mi._get_level_number(2) # <--- positional / name is the same
Out[44]: 2
In [45]: mi = pd.MultiIndex.from_product([[0, 1], [2, 3], [4, 5]], names=[2, 1, 0])
In [46]: mi._get_level_number(0) # <--- name
Out[46]: 2
In [47]: mi._get_level_number(2) # <--- name
Out[47]: 0
In [48]: mi = pd.MultiIndex.from_product([[0, 1], [2, 3], [4, 5]], names=[2, 1, 1])
In [49]: mi._get_level_number(2) # <--- name
Out[49]: 0
In [50]: mi._get_level_number(1) # <--- positional (as name should raise an error given duplicates)
Out[50]: 1
In [51]: mi._get_level_number(0) # <--- positional
Out[51]: 0
In [52]: mi = pd.MultiIndex.from_product([[0, 1], [2, 3], [4, 5]], names=[1, 0, 1])
In [53]: mi._get_level_number(1) # <--- positional (as name should raise an error given duplicates)
Out[53]: 1
In [54]: mi._get_level_number(0) # <--- name
Out[54]: 1
In [55]: mi = pd.MultiIndex.from_product([[0, 1], [2, 3], [4, 5]], names=[0, 0, 1])
In [56]: mi._get_level_number(0) # <--- positional (as name should raise an error given duplicates)
Out[56]: 0
In [57]: mi._get_level_number(1) # <--- name
Out[57]: 2
In [58]: mi._get_level_number(2) # <--- positional
Am I missing something? Was this discussed before?
cc @toobaz