Я делаю эксперименты на мышах.
Секция моего df ниже.
Index Name Time Food Experiment Start
0 Peter 09:00:00 Cheese 2018-08-06 07:30:00
1 Peter 10:00:00 Nut 2018-08-06 07:30:00
2 Peter 11:00:00 Nut 2018-08-06 07:30:00
3 Peter 12:00:00 Cheese 2018-08-06 07:30:00
4 Peter 13:00:00 Nut 2018-08-06 07:30:00
5 Peter 14:00:00 Nut 2018-08-06 07:30:00
6 Peter 15:00:00 Nut 2018-08-06 07:30:00
7 Peter 11:10:00 Nut 2018-08-12 10:30:00
8 Peter 12:10:00 Cheese 2018-08-12 10:30:00
9 Peter 13:10:00 Nut 2018-08-12 10:30:00
Я хочу DF, как это:
Index Name Experiment Start Last Meal in Experiment
0 Peter 2018-08-06 07:30:00 2018-08-06 15:00:00
1 Peter 2018-08-12 10:30:00 2018-08-12 13:10:00
-not enough width-
Count Food Count Nut Count Cheese
7 5 2
3 2 1
Найти «последний прием пищи в эксперименте» легко.
Я сортирую по «Время» (время еды), поэтому последние времена всегда на вершине.
df = df.sort_values(by='Time', ascending=False)
Тогда я сохраню только самые последние последние времена, удалив все остальные дубликаты Имени и времени начала эксперимента.
df = df.drop_duplicates(subset=['Name', 'Experiment Start'])
Я рассчитываю время последнего приема пищи так:
df['Last Meal in Experiment'] = df['Experiment Start'].dt.floor('D') + df['Time']
Теперь у меня должно быть что-то вроде этого (вместе со столбцами Time и Food):
Index Name Experiment Start Last Meal in Experiment
0 Peter 2018-08-06 07:30:00 2018-08-06 15:00:00
1 Peter 2018-08-12 10:30:00 2018-08-12 13:10:00
Но мне не хватает, как узнать количество еды и количество сыра / ореха по времени начала эксперимента Name.
Перед удалением дубликатов я попробовал что-то вроде этого:
df['Count Food'] = df.groupby('Name')['Experiment Start'].transform('count')
Но у панд есть ошибка (новый столбец отформатирован как dt), и я потерялся.