Pandas使用Group By按日期小时分组实现去重求和的代码解决方案
解决方案
你的原有代码直接使用sum聚合会计算分组内所有值的总和,要实现分组后先去重再求和,调整聚合逻辑即可,以下是修改后的完整代码:
dfmi['Time'] = pd.to_datetime(dfmi['Time'], format='%H:%M:%S') dfmi['hours'] = dfmi['Time'].dt.hour # 核心修改:聚合时对每个分组的指定列先去重再求和 sum_dh = dfmi.groupby(['Date','hours']).agg({ 'Amount': lambda x: x.drop_duplicates().sum(), 'Price': lambda x: x.drop_duplicates().sum() }) # 如果你需要将Date、hours从多级索引转为普通列,添加下面这行即可 # sum_dh = sum_dh.reset_index() dfdhsum = pd.DataFrame(sum_dh) # 如果上面执行了reset_index,列名要改成 ['Date','hours','Amount', 'Gas Sales'] dfdhsum.columns = ['Amount', 'Gas Sales'] dfdhsum
如果你的去重逻辑是先对Date+hours分组下的整行重复数据去重,再做聚合,可以先执行去重再分组,代码如下:
dfmi['Time'] = pd.to_datetime(dfmi['Time'], format='%H:%M:%S') dfmi['hours'] = dfmi['Time'].dt.hour # 先按分组键+聚合字段去重,再分组求和 sum_dh = dfmi.drop_duplicates(subset=['Date','hours','Amount','Price'])\ .groupby(['Date','hours'])\ .agg({'Amount': 'sum', 'Price':'sum'}) dfdhsum = pd.DataFrame(sum_dh) dfdhsum.columns = ['Amount', 'Gas Sales'] dfdhsum
内容的提问来源于stack exchange,提问作者Erlangga
相关产品推荐
相关产品推荐

