Pandas按小时分组计算日期后数据的求和与均值问题
Pandas按小时分组聚合并匹配回原DataFrame的解决方案
嘿,我懂你遇到的问题了——想按日期的小时维度分组,计算组内的聚合值(看你示例里的Sum像是组内记录数,也可以换成某列求和,方法通用)和第2列的均值,再把这些结果对应到原表的每一行对吧?
你之前的代码出错是因为groupby().sum()返回的是每个小时一行的聚合结果,它的索引是小时数,和原DataFrame的行索引完全不匹配,直接赋值肯定会出对齐错误。解决这个问题的核心是用transform()方法,它会把组内的聚合结果自动广播到组内的每一行,完美匹配原表的行数。
具体步骤和代码
首先确保你的日期列(第5列)是datetime类型,如果还不是的话先转换:
df[5] = pd.to_datetime(df[5])
然后用transform计算聚合值并匹配回原表:
# 计算组内求和(如果是组内记录数用'count',如果是某列求和比如第3列就写[3].transform('sum')) df['Sum'] = df.groupby(df[5].dt.hour).transform('count') # 计算第2列的组内均值 df['Average'] = df.groupby(df[5].dt.hour)[2].transform('mean')
完整示例(模拟你的数据)
import pandas as pd # 模拟你提供的示例数据 data = { 2: [29, 29, 66, 66, 63, 63, 43, 43], 3: [12, 12, 5, 5, 5, 5, 8, 8], 4: [296, 296, 646, 646, 596, 596, 655, 655], 5: pd.to_datetime([ '2017-01-01 01:00:07.500', '2017-01-01 01:00:07.500', '2017-01-01 01:00:31.410', '2017-01-01 01:00:31.410', '2017-01-01 02:00:32.670', '2017-01-01 02:00:32.670', '2017-01-01 03:00:36.720', '2017-01-01 03:00:36.720' ]) } df = pd.DataFrame(data) # 执行聚合并匹配到原表 df['Sum'] = df.groupby(df[5].dt.hour).transform('count') df['Average'] = df.groupby(df[5].dt.hour)[2].transform('mean') # 查看结果 print(df)
运行后得到的结果就和你期望的完全一致了——同一小时内的所有行都会拥有相同的Sum和Average值,完美对应到每一行。
内容的提问来源于stack exchange,提问作者young_programmer
相关产品推荐
相关产品推荐

