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

GroupBy聚合后列总和与原DataFrame不一致的原因及示例请求

Groupby聚合后列总和与原数据不匹配的原因及示例

以下是几种会导致你遇到的总和不匹配的场景,附代码示例:

1. 分组键包含缺失值(NaN)

pandas的groupby默认会自动排除分组键(如column1/column2)中存在NaN的行,这些行的column5值不会被计入聚合结果的总和,但原DataFrame的sum()会包含这些行(只要column5本身不是NaN)。

import pandas as pd
import numpy as np

# 构造含分组键NaN的数据集
df = pd.DataFrame({
    'column1': ['A', 'A', 'B', np.nan],
    'column2': ['X', 'X', 'Y', 'Z'],
    'column5': [10, 20, 30, 40]
})

# 原数据column5总和
original_sum = df['column5'].sum()
print(f"原数据column5总和: {original_sum}")  # 输出100

# 执行groupby聚合
result_df = df.groupby(['column1', 'column2'])['column5'].sum()
agg_sum = result_df.sum()
print(f"聚合后column5总和: {agg_sum}")  # 输出60(分组键为NaN的行被排除)

2. 浮点数精度误差

当数据集包含大量浮点数时,多次累加的精度误差会导致结果出现微小差异。浮点数在计算机中以近似值存储,大规模数据的累加过程中误差会被逐步放大。

import pandas as pd
import numpy as np

# 构造百万级浮点数据集
np.random.seed(42)
df = pd.DataFrame({
    'column1': np.random.choice(['A', 'B'], size=1_000_000),
    'column2': np.random.choice(['X', 'Y'], size=1_000_000),
    'column5': np.random.randn(1_000_000)
})

original_sum = df['column5'].sum()
result_df = df.groupby(['column1', 'column2'])['column5'].sum()
agg_sum = result_df.sum()

print(f"原数据总和: {original_sum:.10f}")
print(f"聚合后总和: {agg_sum:.10f}")
# 输出示例(存在微小精度差异):
# 原数据总和: 536.7226375054
# 聚合后总和: 536.7226375053

3. 数据被意外过滤或修改

如果在groupby之前或聚合过程中,不小心对数据进行了过滤(如dropna()、布尔索引),或者使用自定义聚合函数导致数据丢失,也会出现总和不匹配。

import pandas as pd

df = pd.DataFrame({
    'column1': ['A', 'A', 'B', 'B'],
    'column2': ['X', 'X', 'Y', 'Y'],
    'column5': [10, 20, 30, 40]
})

# 意外过滤了column5<=15的行
filtered_df = df[df['column5'] > 15]
result_df = filtered_df.groupby(['column1', 'column2'])['column5'].sum()

original_sum = df['column5'].sum()  # 100
agg_sum = result_df.sum()  # 90(丢失了值为10的行)
print(f"原数据总和: {original_sum}, 聚合后总和: {agg_sum}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:55:15