python - pandas groupby .sum 如何返回错误的值?

标签 python pandas

groupby 应用于 DataFrame 时,所得分组值的总和与原始 DataFrame 的列总和不同。这怎么可能?我无法显示我的完整数据,因为它很敏感,而且更烦人的是,我似乎无法重现问题。不过,下面的例子说明了这一点。

假设我有这个数据框,df2:

    A      B    C   D
0   One    1    3   2
1   Two    NaN  6   4
2   Three  3    NaN 8
3   One    4    17  NaN
4   Two    7    NaN 2
5   Three  12   8   15

总结它按预期返回:

`df2.sum()`
    A    OneTwoThreeOneTwoThree
    B                        27
    C                        34
    D                        31
    dtype: object

然后使用这个groupby:

df3 = df2.groupby(['A'])[['B', 'C', 'D']].sum()

返回这个:

        B   C   D
A           
One     5   20  2
Three   15  8   23
Two     7   6   6

求和返回与原始列求和相同的值:

df3.sum()
B    27
C    34
D    31
dtype: float64

然而,在我的实际数据中,原始值是:

13496 non-null float64
11421 non-null float64
10890 non-null float64
10714 non-null float64

但是在使用 .sum() 执行与上面相同的 groupby 之后,分组的行总和为:

13021
11071
10568
10408

我在这里缺少一些 pandas 警告或陷阱吗?值(value)观是如何丢失的?这显然不是一个可以回答的直接编程问题,而是一个 Pandas “内部运作”问题。我在 pandas 文档中没有看到任何关于此的内容,也没有关于它的任何问题。

最佳答案

A 列中是否有任何 NaN 值?这会产生您所描述的行为,因为 NaN 值在分组时会被丢弃。考虑下面的 DataFrame:

     A    B     C      D
0    x  1.0   NaN  100.0
1    x  2.0  21.0  105.0
2    y  NaN  22.0  110.0
3  NaN  4.0  23.0  115.0
4    z  5.0  24.0  120.0
5    z  6.0  25.0    NaN 

然后 df.sum() 产生:

B     18.0
C    115.0
D    550.0
dtype: float64

但是 df.groupby('A')['B', 'C', 'D'].sum().sum() 产生:

B     14.0
C     92.0
D    435.0
dtype: float64 

关于python - pandas groupby .sum 如何返回错误的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36480705/

相关文章:

Python Pandas : filter a dataframe based on boolean pandas series

python - 从隐藏在多索引中的年份和月份创建日期时间

python - 跟踪 Django 包更新

python - 如何将 csv 中的每一列保存到列表中?

python - 连接 pandas DataFrame 上的散点图线

python - 从满足条件的 Pandas 列中提取属性

python - 比较数据框中特定列的差异

pandas - 如何将 FastAPI 中的 Pydantic 模型转换为 Pandas DataFrame?

python - 具有多列的 GtkTreeView 和具有单一自定义类型的 GtkListStore(在 Python 中)

python - 名字和姓氏未以 django 形式显示