将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
然而,使用groupby
与上述.sum()
相同后,分组的行总和为:
13021
11071
10568
10408
是否有一些大熊猫警告或者我在这里失踪?价值如何丧失?这显然不是一个可以回答的直接编程问题,而是更多的大熊猫内部工作'题。我在熊猫文档中没有看到关于此的任何内容,也没有任何关于它的SO问题。
答案 0 :(得分:3)
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
答案 1 :(得分:1)
可以解释A
是否具有nan值。
>>> df = pd.DataFrame(np.random.randint(0,10,(5,3)))
>>> df['A'] = np.random.randint(0,2,5)
>>> df['A'][0] = np.NAN
>>> df
Out[52]:
0 1 2 A
0 2 1 5 NaN
1 6 9 7 0
2 5 2 6 1
3 8 4 7 0
4 2 3 4 1
>>> df.sum()
Out[53]:
0 23
1 19
2 29
A 2
dtype: float64
>>> np.sum(df.groupby(by = 'A').sum())
Out[54]:
0 21
1 18
2 24
dtype: int64