如何对Pandas分组DataFrame执行左连接?合并groupby对象遇KeyError
问题分析与解决方法
嘿,这个坑我之前踩过!你遇到的KeyError: 'Month'核心原因很明确:你直接拿groupby对象去执行合并操作了,但df_archives_gb并不是一个可直接用于合并的DataFrame——它只是一个存储分组规则的中间对象,哪怕你知道它包含Month和Bucket作为分组键,这些键在groupby对象里是索引(或者说分组标识),而非普通的DataFrame列,所以pd.merge找不到对应的列名。
解决步骤
要解决这个问题,你需要先把groupby对象转换成标准的DataFrame,再执行合并:
对groupby对象执行聚合(或展开)操作,生成DataFrame
首先你得明确分组后需要保留什么数据:如果是需要分组聚合结果(比如求和、均值、计数):
举个例子,假设你要按Month和Bucket分组后计算某列的总和:# 先聚合,再用reset_index()把分组键转回普通列 df_archives = df_archives_gb.sum().reset_index()这里的
reset_index()是关键!聚合后的分组键(Month、Bucket)会默认成为DataFrame的索引,必须用这个方法把它们变回普通列,才能和df_output_pacer的列对应上。如果是需要保留分组后的所有原始数据(不做聚合):
可以用apply把每个分组转回DataFrame,再合并:df_archives = df_archives_gb.apply(lambda x: x).reset_index(drop=True)
执行左连接操作
现在用转换后的df_archives去和df_output_pacer合并:df_comparer = pd.merge(df_output_pacer, df_archives, how='left', on=['Month', 'Bucket'])
额外验证小技巧
你可以在转换前先打印df_archives_gb.sum()(或者你用的聚合方法)的结构,就能清楚看到Month和Bucket是索引而非列——这就是合并时找不到键的根本原因。
内容的提问来源于stack exchange,提问作者lte__
相关产品推荐
相关产品推荐

