Используйте DataFrame.melt
с повторяющимися строками по счетам с Index.repeat
и DataFrame.loc
:
df1 = df.melt('ID', var_name='Materials')
df1 = df1.loc[df1.index.repeat(df1['value'])].drop('value', axis=1).reset_index(drop=True)
print (df1)
ID Materials
0 24 Material1
1 12 Material1
2 12 Materia2
3 25 Material3
4 25 Material3
РЕДАКТИРОВАТЬ: Только для добавления 0
Материалы с пропущенными значениями используют DataFrame.merge
с левым соединением оригинала df['ID']
в одном столбце DataFrame без дублирования на DataFrame.drop_duplicates
:
df1 = df.melt('ID', var_name='Materials')
df0 = df[['ID']].drop_duplicates()
print (df0)
ID
0 14
1 24
2 12
3 25
df2 = df1.loc[df1.index.repeat(df1['value'])].drop('value', axis=1).reset_index(drop=True)
df2 = df0.merge(df2, on='ID', how='left')
print (df2)
ID Materials
0 14 NaN
1 24 Material1
2 12 Material1
3 12 Materia2
4 25 Material3
5 25 Material3