为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

回首忆惘然 2021-06-02 21:34:40
我在老鼠身上做实验。我的 df 的一部分如下。Index   Name    Time        Food    Experiment Start0       Peter   09:00:00    Cheese  2018-08-06 07:30:001       Peter   10:00:00    Nut     2018-08-06 07:30:002       Peter   11:00:00    Nut     2018-08-06 07:30:003       Peter   12:00:00    Cheese  2018-08-06 07:30:004       Peter   13:00:00    Nut     2018-08-06 07:30:005       Peter   14:00:00    Nut     2018-08-06 07:30:006       Peter   15:00:00    Nut     2018-08-06 07:30:007       Peter   11:10:00    Nut     2018-08-12 10:30:008       Peter   12:10:00    Cheese  2018-08-12 10:30:009       Peter   13:10:00    Nut     2018-08-12 10:30:00我想要一个这样的 df:Index   Name    Experiment Start        Last Meal in Experiment0       Peter   2018-08-06 07:30:00     2018-08-06 15:00:001       Peter   2018-08-12 10:30:00     2018-08-12 13:10:00-not enough width-Count Food  Count Nut   Count Cheese7           5           23           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 Experiment0       Peter   2018-08-06 07:30:00     2018-08-06 15:00:001       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 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

使用GroupBy.sizeunstack

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  


查看完整回答
反对 回复 2021-06-06
  • 1 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信