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的分组占比上升,被排除的分组越来越多,最终导致聚合结果行数骤减。
验证方法
- 检查特征列的缺失值情况:
# 统计每列的缺失值数量 df[features].isna().sum()
- 确认groupby对象中是否存在含NaN的分组:
grpby = df.groupby(features[:35]) for key, _ in grpby: if any(pd.isna(k) for k in key): print("检测到含NaN的分组:", key) break
解决办法
- 数据清洗补全:如果缺失值属于数据错误,先通过填充、删除等方式处理缺失值后再进行分组聚合。
- 保留含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
相关产品推荐
相关产品推荐

