Как дублировать строки на основе разницы в годах в pandas - PullRequest
0 голосов
/ 07 января 2020
import pandas
data={"Item":"2047125","Model":"HM","Category":"Mechanical","Year":"1984-1988"}
df=pandas.DataFrame(data,index=[0])



      Item   Model    Category       Year
0  2047125    HM     Mechanical    1984-1988

Мне нужно продублировать строки для разницы в годах.

  Item   Model    Category       Year
2047125    HM     Mechanical     1984
2047125    HM     Mechanical     1985
2047125    HM     Mechanical     1986
2047125    HM     Mechanical     1987
2047125    HM     Mechanical     1988

Как мне этого добиться?

1 Ответ

2 голосов
/ 07 января 2020

Первая идея - создать списки всех лет с помощью пользовательской функции, а затем изменить ее на 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
...