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
相关产品推荐
相关产品推荐

