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

时间:2016-04-07 15:27:46

标签: 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

然而,使用groupby与上述.sum()相同后,分组的行总和为:

13021
11071
10568
10408

是否有一些大熊猫警告或者我在这里失踪?价值如何丧失?这显然不是一个可以回答的直接编程问题,而是更多的大熊猫内部工作'题。我在熊猫文档中没有看到关于此的任何内容,也没有任何关于它的SO问题。

2 个答案:

答案 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