需要按日期和名称对列进行分组,并用它们的开始和结束获得最小值
dataframe
day name value start end duration
Wednesday AAA 1 10/23/2019 2:46 10/23/2019 3:09 00:23
Wednesday AAA 1 10/23/2019 5:20 10/23/2019 5:44 00:24
Wednesday AAA 1 10/23/2019 6:51 10/23/2019 8:14 01:23
Wednesday AAA 17602 10/23/2019 12:35 10/23/2019 12:38 00:03
Wednesday AAA 1155 10/23/2019 15:50 10/23/2019 15:54 00:04
逻辑
df.groupby(['day','name']).agg({'duration':[np.min,np.max],'start':[np.min,np.max],'end':[np.min,np.max],'value':[np.min,np.max]})
我得到的
day name duration_min duration_max duration_max_start duration_max_end duration_min_start duration_min_end value_min value_max
Wednesday AAA 00:03 01:23 10/23/2019 6:51 10/23/2019 3:09 10/23/2019 12:35 10/23/2019 15:54 1 17602
但是我应该得到什么
day name duration_min duration_max duration_max_start duration_max_end value_max duration_min_start duration_min_end value_min
Wednesday AAA 00:03 01:23 10/23/2019 6:51 10/23/2019 8:14 1 10/23/2019 12:35 10/23/2019 12:38 17602
我想要的是通过分组它们的起始值和结束值来获得最小值和最大值
您想要的是出现持续时间min和max的同一行上的属性。你写的是每一列的最小值和最大值,无论它们是否在同一行。
使用idxmin
&idxmax
查找出现最小值和最大值的行,然后与原始帧合并:
idx = df.groupby(['day','name'])['duration'].agg(['idxmin','idxmax'])
idx.merge(df.add_suffix('_min'), left_on='idxmin', right_index=True)
.merge(df.add_suffix('_max'), left_on='idxmax', right_index=True)
[['duration_min', 'duration_max', 'start_min', 'end_min', 'start_max', 'end_max', 'value_min', 'value_max']]
结果:
day | name | duration_min | duration_max | start_min | end_min | start_max | end_max | value_min | value_max
Wednesday | AAA | 00:03 | 01:23 | 2019-10-23 12:35:00 | 2019-10-23 12:38:00 | 2019-10-23 06:51:00 | 2019-10-23 08:14:00 | 17602 | 1
根据需要重命名列。