Первая идея - создать списки всех лет с помощью пользовательской функции, а затем изменить ее на DataFrame.explode
, рабочую форму 0.25+
:
def f(x):
s, e = x.split('-')
return list(range(int(s), int(e) + 1))
df['Year'] = df['Year'].apply(f)
df = df.explode('Year').reset_index(drop=True)
print (df)
Item Model Category Year
0 2047125 HM Mechanical 1984
1 2047125 HM Mechanical 1985
2 2047125 HM Mechanical 1986
3 2047125 HM Mechanical 1987
4 2047125 HM Mechanical 1988
Другое решение - использовать Series.str.split
для помощника DataFrame
df1
, затем используйте Index.repeat
по разности столбцов с DataFrame.loc
для новых строк и последним добавьте значения счетчика с GroupBy.cumcount
:
df1 = df['Year'].str.split('-', expand=True).astype(int)
df['Year'] = df1[0].astype(int)
df = df.loc[df.index.repeat(df1[1] - df1[0] + 1)]
df['Year'] = df.groupby(level=0).cumcount() + df['Year']
df = df.reset_index(drop=True)
print (df)
Item Model Category Year
0 2047125 HM Mechanical 1984
1 2047125 HM Mechanical 1985
2 2047125 HM Mechanical 1986
3 2047125 HM Mechanical 1987
4 2047125 HM Mechanical 1988