шагов - создать столбец, который заменяет 0 на последний выбор, используя ffill
- с помощью бесшумного широковещания сравнить уникальные варианты со смещенным последним выбором, чтобы получить фиктивные данные - создать фиктивные данные из фрейма данных и объединить их в df
Редактировать
- исправлен код без учета идентификаторов - также добавлена строка 5 для его проверки
import numpy as np
import pandas as pd
ls = [("A", "07/16/2019 ", 123),
("A", "07/17/2019 ", 789),
("A", "07/18/2019 ", 0),
("A", "07/19/2019 ", 456),
("B", "07/16/2019 ", 789),
("B", "07/18/2019 ", 123),
("B", "07/17/2019 ", 0),
("B", "07/18/2019 ", 123),]
df = pd.DataFrame(ls, columns=["id", "date", "choice"])
df = df.sort_values("id")
prev_choice = df["choice"].mask(df["choice"]==0, np.nan).ffill().shift()
prev_choice[df["id"]!=df["id"].shift()] = 0
unique_choices = np.delete(np.unique(df["choice"]), 0)
last_choice = np.zeros((len(df), len(unique_choices)))
last_choice = np.equal(unique_choices[np.newaxis,:], prev_choice
.values[:, np.newaxis])
dummy_df = pd.DataFrame(last_choice, columns = [f"{choice}_L" for choice in unique_choices])
pd.concat([df, dummy_df], axis=1)
Результат
id date choice 123_L 456_L 789_L
0 A 07/16/2019 123 False False False
1 A 07/17/2019 789 True False False
2 A 07/18/2019 0 False False True
3 A 07/19/2019 456 False False True
4 B 07/16/2019 789 False False False
5 B 07/18/2019 123 False False True
6 B 07/17/2019 0 True False False
7 B 07/18/2019 123 True False False