Вот один из способов, я бы сначала создал столбец 'level_list' из 'Range Range' с range
числами, поэтому для 'L2-L5' список будет [2,3,4,5 ].
df['level_list'] = (df['Level Range'].str.split('-',expand=True)
.stack().str[-1].unstack()
.apply(lambda x: range(int(x[0]),int(x[1])+1),1))
Теперь, используя продукт из itertools и два столбца со списком (Group и level_list), вы можете создать новый фрейм данных:
from itertools import product
df_new = pd.DataFrame([ [ind, group, level_range, g, l]
for ind, group, level_range, level_list
in df[['Group','Level Range', 'level_list']].itertuples()
for l, g in product(level_list, group) ],
columns = ['original_ind','Group', 'Level Range', 'Fruit','Level'])
с вводом типа
df = pd.DataFrame({'Group':[['Apple','Banana']], 'Level Range': ['L2-L5']})
результат для df_new
:
original_ind Group Level Range Fruit Level
0 0 [Apple, Banana] L2-L5 Apple 2
1 0 [Apple, Banana] L2-L5 Banana 2
2 0 [Apple, Banana] L2-L5 Apple 3
3 0 [Apple, Banana] L2-L5 Banana 3
4 0 [Apple, Banana] L2-L5 Apple 4
5 0 [Apple, Banana] L2-L5 Banana 4
6 0 [Apple, Banana] L2-L5 Apple 5
7 0 [Apple, Banana] L2-L5 Banana 5
Обратите внимание: если вас не интересует исходный индекс, вы можете удалить столбец или не создавать его