使用Pandas的pd.Grouper分组后仅显示一个分区,如何获取全部分组?
解决pd.Grouper分组仅显示一个分区的问题
看起来你遇到的问题大概率是旧版本pandas的兼容性bug导致的,不过没关系,咱们可以用几种方法快速解决:
先排查基础问题
首先确认你的date列确实被正确转换成了datetime类型,执行这段代码检查:
print(df.dtypes)
如果date列的类型不是datetime64[ns],说明转换过程可能出了问题,你可以改用更明确的转换方式:
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')
解决方案1:升级pandas版本
旧版本的pandas在pd.Grouper与分组列组合使用时,偶尔会出现分组键生成不完整的bug。升级到最新稳定版本通常就能搞定这个问题:
pip install --upgrade pandas
升级后再运行你原来的分组代码,应该就能看到所有预期的分组键了。
解决方案2:替代pd.Grouper,直接提取月份周期分组
如果不想升级版本,或者想要更直观的分组方式,可以直接从date列中提取年月周期来分组,这种方法兼容性更好:
# 方式1:先创建月份列再分组 df['month'] = df['date'].dt.to_period('M') g = df.groupby(['zone', 'month']) # 方式2:直接在groupby中使用,无需额外列 g = df.groupby(['zone', df['date'].dt.to_period('M')])
此时查看分组键:
print(g.groups.keys())
会得到所有预期的分组:
dict_keys([('AL', Period('2014-01')), ('BS', Period('2014-01')), ('RF', Period('2014-01'))])
这种方法的优势是,Period类型保留了时间序列的特性,后续做时间相关分析会更方便;如果偏好字符串格式的年月,也可以用df['date'].dt.strftime('%Y-%m')替代dt.to_period('M')。
内容的提问来源于stack exchange,提问作者Pax
相关产品推荐
相关产品推荐

