pandas合并DataFrame同特征行计算列均值及ValueError报错排查
问题描述
现有一个包含两类信息的pandas DataFrame:
- 特征属性列:共3列,混合整数、字符串类型,存储条目的属性特征
- 排放值列:共2列,为浮点格式,存储对应条目的排放监测值
原始样例数据如下:
| Charact. 1 | Charact. 2 | Charact. 3 | Emission 1 | Emission 2 |
|---|---|---|---|---|
| 1998 | AB | C | 1 | 2 |
| 1998 | AB | C | 3 | 4 |
| 2000 | AB | C | 1 | 2 |
| 2001 | DE | F | 1 | 2 |
| 2001 | DE | F | 3 | 4 |
需求为:将3个特征列取值完全相同的行合并,计算2个排放列的均值,得到如下结构的结果表:
| Charact. 1 | Charact. 2 | Charact. 3 | Emission 1 | Emission 2 |
|---|---|---|---|---|
| 1998 | AB | C | 2 | 3 |
| 2000 | AB | C | 1 | 2 |
| 2001 | DE | F | 2 | 3 |
报错现象
使用如下代码尝试实现需求时触发报错:
df.groupby(['Charact. 1', 'Charact. 2', 'Charact. 3'], as_index=False).agg({'Emission 1': 'mean', 'Emission 2': 'mean',})
具体报错信息:
ValueError: Length of values (10345) does not match length of index (10687600)
报错原因
该报错本质是DataFrame索引结构损坏导致的:
- 报错信息里的
10687600是原始DataFrame的总行数,10345是分组后得到的唯一特征组数量 - 当
groupby传入as_index=False参数时,pandas会尝试将分组聚合后的短结果对齐到原始DataFrame的长索引上。如果此前对DataFrame做过不规范的行拼接、条件筛选、原地赋值等操作,导致索引重复、错位、不连续,就会出现结果长度和索引长度不匹配的报错。
可以先执行以下代码确认索引问题:
# 检查索引是否唯一,返回False则说明索引存在重复/损坏 print(df.index.is_unique)
正确实现方案
方案1:修复索引后运行原逻辑
先重置索引修复错位的索引结构,再执行原有聚合逻辑,写法和最初的代码逻辑完全一致:
# 重置索引,丢弃原有损坏的索引 df_fixed = df.reset_index(drop=True) result = df_fixed.groupby( ['Charact. 1', 'Charact. 2', 'Charact. 3'], as_index=False )[['Emission 1', 'Emission 2']].mean()
方案2:绕开as_index的索引对齐逻辑
分组时不设置as_index=False,聚合完成后再重置索引,从根源避免索引匹配问题,兼容性更强:
result = df.groupby( ['Charact. 1', 'Charact. 2', 'Charact. 3'] )[['Emission 1', 'Emission 2']].mean().reset_index()
两种方案输出的结果完全匹配需求中的目标表结构,用样例数据测试可得到预期的均值计算结果。
内容的提问来源于stack exchange,提问作者Mikel Alba
相关产品推荐
相关产品推荐

