Dask DataFrame使用pd.Grouper报错,求实现方案或等效替代方法
在Dask DataFrame中替代pd.Grouper的解决方案
问题描述
在Dask DataFrame中尝试使用pd.Grouper进行多维度+时间频率分组时,触发如下错误:
NotImplementedError: pd.Grouper is currently not supported by Dask
示例代码如下(补全了缺失的Timestamp导入):
import pandas as pd import dask.dataframe as dd from pandas import Timestamp data_dict = { "FaturaTarih": { 0: Timestamp("2021-10-04 00:00:00"), 1: Timestamp("2021-12-18 00:00:00"), 2: Timestamp("2021-10-09 00:00:00"), 3: Timestamp("2021-12-18 00:00:00"), 4: Timestamp("2021-12-26 00:00:00"), }, "MüsteriNo": {0: "0", 1: "1", 2: "2", 3: "3", 4: "4"}, "SUBEADI": {0: "O", 1: "O", 2: "O", 3: "K", 4: "K"}, "KATEGORIADI": {0: "SO", 1: "BU", 2: "RE", 3: "ÇİKOLATALAR", 4: "AT"}, "MüsteriSınıf": {0: "LOK", 1: "LOK", 2: "LOK", 3: "KAFE", 4: "EGI"}, "Adet": {0: 12.0, 1: 1.0, 2: 1.0, 3: 36.0, 4: 20.0}, "NetTutar": {0: 9.38, 1: 13.52, 2: 17.5, 3: 102.6, 4: 29.6}, } df = dd.from_pandas(pd.DataFrame(data_dict), npartitions=4) # 原报错代码 # new_df = (pd.DataFrame(df.groupby(['MüsteriNo', 'SUBEADI', 'KATEGORIADI', pd.Grouper(key='FaturaTarih', freq='M')]) # [['Adet', 'NetTutar']].sum()).reset_index())
等效解决方案
由于Dask对pd.Grouper的支持尚未覆盖所有多分组场景,最稳定的替代方式是提前生成时间周期列,再将其加入分组维度:
方法:创建时间周期列后分组
利用Dask的dt访问器将时间列转换为目标频率的周期(如月份),再执行分组求和:
# 生成按月份聚合的时间列 df['FaturaAy'] = df['FaturaTarih'].dt.to_period('M') # 替换原pd.Grouper逻辑,直接使用新列分组 new_df = df.groupby(['MüsteriNo', 'SUBEADI', 'KATEGORIADI', 'FaturaAy']) \ [['Adet', 'NetTutar']].sum().reset_index().compute() # 查看结果 print(new_df)
关键说明
dt.to_period('M')会将FaturaTarih转换为YYYY-MM格式的周期对象,与pd.Grouper(freq='M')的聚合逻辑完全一致。- 若需要其他时间频率(如季度
'Q'、天'D'),只需修改to_period的参数即可。 - 最后调用
compute()将Dask DataFrame转换为Pandas DataFrame(若需保持分布式计算可省略此步)。
内容的提问来源于stack exchange,提问作者Nuri Taş
相关产品推荐
相关产品推荐

