从分组计数创建列(涉及日期时间列)

我在老鼠身上做实验。


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

现在我应该有这样的东西(以及时间和食物列):


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),我迷路了。


回首忆惘然
浏览 161回答 1
1回答

鸿蒙传说

使用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  
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python