get_dummies
+ interpolate
Для этого требуется, чтобы ваши столбцы сортировались по времени, и в идеале, чтобы начало и конец всегда присутствовали в именах столбцов.
df = df.set_index(['ID', 'Car', 'Start', 'Finish'])
s1 = (pd.get_dummies(df.index.get_level_values('Start'))
.reindex(df.columns, axis=1)
.replace(0, np.NaN))
s2 = (pd.get_dummies(df.index.get_level_values('Finish'))
.reindex(df.columns, axis=1)
.replace(0, np.NaN))
res = s1.combine_first(s2).interpolate(axis=1, limit_area='inside').fillna(0, downcast='infer')
res.index = df.index
res = res.reset_index()
Вывод res
:
ID Car Start Finish Jan17 Jun18 Dec18 Apr19
0 0 Nissan Jun18 Dec18 0 1 1 0
1 1 Porsche Jan17 Apr19 1 1 1 1
2 2 Golf Jun18 Apr19 0 1 1 1
3 3 Toyota Jan17 Apr19 1 1 1 1
4 4 Mazda Dec18 Apr19 0 0 1 1
5 5 Mercedes Apr19 Apr19 0 0 0 1
6 6 Passat Jun18 Jun18 0 1 0 0
В случае, когда Start
и Finish
уже получены из самих данных (кажется, это первый и последний ненулевые столбцы), вы можете пропустить все пустышки и использовать where
вместо оригинальный DataFrame.
df = df.set_index(['ID', 'Car', 'Start', 'Finish'])
res = (df.where(df.ne(0))
.clip(1,1)
.interpolate(axis=1, limit_area='inside')
.fillna(0, downcast='infer')
.reset_index())