You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas聚合GroupBy结果尺寸异常问题排查

Pandas Groupby聚合结果行数异常问题排查

问题描述

处理机器学习训练数据集时,使用Pandas groupby计算分组目标均值时出现异常:随着分组特征数量增加,聚合后的结果行数与len(grpby)统计的唯一分组数不再匹配,行数骤减。

数据集包含id、特征和目标列,部分分组存在目标值不一致的情况,核心代码如下:

id_cols = list(df.columns[:4])
features = list(df.columns[4:-1])
target = df.columns[-1]
ad_id = id_cols[1]
creative_id = id_cols[-1]

测试代码及输出:

for n in [10,20,30, 35, 40, 50,100,200]:
    grpby = df.groupby(features[:n])
    mean_targets = grpby[target].agg(["mean"])
    print(n, len(grpby), mean_targets.shape)
# 输出:
# 10 1349 (1349, 1)
# 20 1882 (1882, 1)
# 30 1978 (1978, 1)
# 35 1978 (31, 1)
# 40 1978 (31, 1)
# 50 1978 (31, 1)
# 100 1978 (19, 1)
# 200 4870 (2, 1)

原因分析

这种现象不是操作错误,也不是Pandas的硬性限制,核心原因是:

  • Pandas groupby默认参数dropna=True,会自动排除所有包含缺失值(NaN)的分组;
  • 但len(grpby)统计的是包含NaN分组在内的全部唯一分组数,因此两者出现数值差异;
  • 随着分组特征数量增加,含NaN的分组占比上升,被排除的分组越来越多,最终导致聚合结果行数骤减。

验证方法

  1. 检查特征列的缺失值情况:
# 统计每列的缺失值数量
df[features].isna().sum()
  1. 确认groupby对象中是否存在含NaN的分组:
grpby = df.groupby(features[:35])
for key, _ in grpby:
    if any(pd.isna(k) for k in key):
        print("检测到含NaN的分组:", key)
        break

解决办法

  1. 数据清洗补全:如果缺失值属于数据错误,先通过填充、删除等方式处理缺失值后再进行分组聚合。
  2. 保留含NaN的分组:在groupby时设置dropna=False(需Pandas 1.1.0及以上版本支持),这样聚合结果会包含所有含NaN的分组,行数与len(grpby)一致:
for n in [10,20,30, 35, 40, 50,100,200]:
    grpby = df.groupby(features[:n], dropna=False)
    mean_targets = grpby[target].agg(["mean"])
    print(n, len(grpby), mean_targets.shape)

内容的提问来源于stack exchange,提问作者mchristos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 19:56:09