Использование MultiIndex.from_product
с Series.reindex
:
df = pd.DataFrame({'I0': [0,0,1,2,2,3], 'I1': [0,1,0,0,1,1], 'Value': [1,2,3,5,6,8]})
mux = pd.MultiIndex.from_product([df['I0'].unique(), [0,1]], names=['I0','I1'])
mux = pd.MultiIndex.from_product([np.arange(df['I0'].max() + 1),
df['I1'].unique()],
names=['I0','I1'])
mux = pd.MultiIndex.from_product([df['I0'].unique(), df['I1'].unique()], names=['I0','I1'])
df = df.set_index(['I0', 'I1']).reindex(mux)
print (df)
Value
I0 I1
0 0 1.0
1 2.0
1 0 3.0
1 NaN
2 0 5.0
1 6.0
3 0 NaN
1 8.0
EDIT:
После того, как какое-то решение для обсуждения было изменено - чтобы сохранить другие уровни MultiIndex, сначала необходимо преобразовать уровни в целые числа (чтобы избежать сортировки в виде строк), а затем использовать unstack
с stack
. Для сохранения NaN
s используйте параметр dropna=False
:
a = df.index.get_level_values(0).astype(int)
b = df.index.get_level_values(1).astype(int)
c = df.index.get_level_values(2) # String index level
d = df.index.get_level_values(3).astype(int)
df.index = pd.MultiIndex.from_arrays([a, b, c, d], names=df.index.names)
df = df.unstack().stack(dropna=False)