Использовать понимание списка с конструктором range
и DataFrame
:
df[['from','to']] = df[['from','to']].astype(int)
zipped = zip(df['name'], df['from'], df['to'])
df = pd.DataFrame([(i, y) for i,j,k in zipped for y in range(j, k+1)], columns=['name','id'])
print (df)
name id
0 L1 1
1 L1 2
2 L1 3
3 L2 5
4 L2 6
5 L2 7
Другое решение:
df[['from','to']] = df[['from','to']].astype(int)
s = df['to'] - df['from'] + 1
df = df.loc[df.index.repeat(s), ['name','from']].rename(columns={'from':'no'})
df['no'] += df.groupby(level=0).cumcount()
df = df.reset_index(drop=True)
print (df)
name no
0 L1 1
1 L1 2
2 L1 3
3 L2 5
4 L2 6
5 L2 7