将 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/