Создать столбцы из сгруппированных подсчетов (включая столбец даты и времени) - PullRequest
0 голосов
/ 29 августа 2018

Я делаю эксперименты на мышах.

Секция моего 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), и я потерялся.

1 Ответ

0 голосов
/ 29 августа 2018

Использование GroupBy.size с unstack:

df1= df.groupby(['Name','Experiment Start','Food']).size().unstack()
df1['All'] = df1.sum(axis=1)

или crosstab:

df1 = pd.crosstab([df['Name'],df['Experiment Start']], df['Food'], margins=True)

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']

df = df.join(df1, on=['Name','Experiment Start'])
print (df)
        Name     Time Food    Experiment Start Last Meal in Experiment  \
Index                                                                    
6      Peter 15:00:00  Nut 2018-08-06 07:30:00     2018-08-06 15:00:00   
9      Peter 13:10:00  Nut 2018-08-12 10:30:00     2018-08-12 13:10:00   

       Cheese  Nut  Count  
Index                      
6           2    5      7  
9           1    2      3  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...