Pandas groupby在DataFrame为空时丢失列,如何保留指定列?
空DataFrame分组求和后保留列的解决方案
执行df2=df[["A", "B"]].groupby(["A"]).sum()时,若原df无数据行,分组结果会丢失所有列。以下几种方法能确保空数据场景下仍保留B列:
方法1:as_index=False+强制列重定向
让分组结果不将A设为索引,再强制保留目标列结构:
df2 = df[["A", "B"]].groupby("A", as_index=False).sum() # 不管结果是否为空,强制保留A、B列 df2 = df2.reindex(columns=["A", "B"])
方法2:预定义空模板合并结果
先创建符合预期列结构的空DataFrame,再和分组结果合并,保证列不丢失:
# 先定义目标列的空模板 template = pd.DataFrame(columns=["A", "B"]) df2 = df[["A", "B"]].groupby("A").sum().reset_index() # 合并模板确保列结构完整 df2 = pd.concat([template, df2], ignore_index=True)
方法3:指定聚合列并判断补全
明确指定聚合B列,若结果为空则手动构造列结构:
df2 = df[["A", "B"]].groupby("A").agg(B_sum=("B", "sum")).reset_index() # 重命名回原列名 df2 = df2.rename(columns={"B_sum": "B"}) # 空结果时补全列 if df2.empty: df2 = pd.DataFrame(columns=["A", "B"])
方法4:针对分类列用observed=False
如果A列是分类类型,可通过observed=False强制保留分类维度,即使无对应数据:
# 先将A设为分类类型 df["A"] = df["A"].astype("category") df2 = df[["A", "B"]].groupby("A", observed=False).sum()
这种方式下,即使原df为空,df2会保留A的所有预设分类值和B列,对应值为0。
内容的提问来源于stack exchange,提问作者Dominik Lisiakiewicz
相关产品推荐
相关产品推荐

