Один из вариантов - добавить cumcount
уровень:
df.set_index(df.groupby(level=[0,1]).cumcount(), append=True)
value
cluster_label date
0 2018-11 0 1.5
1 7.0
2 2.5
1 2018-11 0 3.0
1 0.5
2 2018-11 0 1.0
Где,
df.set_index(df.groupby(level=[0,1]).cumcount(), append=True).index
# MultiIndex(levels=[[0, 1, 2], [2018-11], [0, 1, 2]],
# labels=[[0, 0, 0, 1, 1, 2], [0, 0, 0, 0, 0, 0], [0, 1, 2, 0, 1, 0]],
# names=['cluster_label', 'date', None])
Другой вариант (я не рекомендую это) - этозамаскируйте эти значения явным образом и сбросьте индекс.
u = np.where(df.index.duplicated(), '', df.index.get_level_values(1))
df.index = pd.MultiIndex.from_arrays([df.index.get_level_values(0), u])
df
value
cluster_label
0 2018-11 1.5
7.0
2.5
1 2018-11 3.0
0.5
2 2018-11 1.0