Pandas多列分组聚合疑问:按工具和日期分组计算传感器均值的实现逻辑解析
你是不是看着ChatGPT给的代码,纳闷为啥没看到直接写“按天分组”的参数?其实它是通过提取日期字段的方式间接实现按天聚合的,我给你一步步拆解清楚:
先回顾你的需求
你原本的代码是按Tool和完整的Timestamp(精确到分秒)分组,这样每个分组大概率只有一条数据,没法实现“同一天同工具的传感器均值”。而你要的是:先按工具分组,再把同一天的传感器数据归为一组算均值,核心是把“具体时间戳”变成“日期(天)”作为分组依据。
拆解ChatGPT的实现逻辑
我们一步步看代码里的“按天分组”是怎么藏起来的:
把时间字符串转成Pandas可识别的datetime类型
df['TimeStamp'] = pd.to_datetime(df['TimeStamp'])原始的
TimeStamp是字符串格式(比如'2022-05-28 05:03:00'),Pandas没法直接对字符串做日期相关的操作,所以先转成datetime64类型,这样才能调用dt属性提取日期。提取日期部分生成新列——这就是“按天分组”的核心
df['Date'] = df['TimeStamp'].dt.date这里的
dt.date是Pandas datetime对象的属性,它会把精确到分秒的时间戳,只保留年-月-日的部分(比如把2022-05-28 05:03:00变成2022-05-28)。这样一来,同一天的所有记录,Date字段的值完全相同,这就给“按天分组”提供了依据。按工具+日期分组,计算均值
result = df.groupby(['Tool', 'Date']).agg({ 'Sensor1': 'mean', 'Sensor2': 'mean', 'Sensor3': 'mean' }).reset_index()现在
groupby(['Tool', 'Date'])就是先按工具分组,再按日期(天)分组,同一个工具同一天的所有传感器数据会被归为一组,然后用agg计算每个传感器的均值,reset_index是把分组用的Tool和Date从索引变回普通列,方便查看结果。
给你补充一个更简洁的写法
其实不用单独生成Date列,直接在groupby里提取日期就行,效果完全一样:
import pandas as pd df = pd.DataFrame( { "Tool": [1 , 2 , 1 , 2, 2, 2, 1, 2, 1,2], "TimeStamp": ['2022-05-28 05:03:00','2022-05-29 06:07:00','2022-05-28 07:11:00','2022-05-27 11:04:00', '2022-05-27 05:43:00','2022-05-25 06:07:00','2022-05-28 11:22:00','2022-05-28 02:00:00', '2022-05-26 04:22:00','2022-05-28 09:55:00'], "Sensor1": [10,11,12,13,6,7,3,11,8,9], "Sensor2": [5,4,3,3,5,4,3,3,8,2], "Sensor3": [1,2,3,6,1,2,3,6,4,5], } ) # 转成datetime后,直接在groupby里提取日期 df['TimeStamp'] = pd.to_datetime(df['TimeStamp']) result = df.groupby(['Tool', df['TimeStamp'].dt.date]).agg( Sensor1_mean=('Sensor1', 'mean'), Sensor2_mean=('Sensor2', 'mean'), Sensor3_mean=('Sensor3', 'mean') ).reset_index() print(result)
这样少了一步生成新列的操作,代码更紧凑,而且给聚合后的列起了更清晰的名字。
备注:内容来源于stack exchange,提问作者Всеволод Леонтьев

