在groupby()的情况下,我无法理解sum()的工作方式。 Official docs说它可以计算值的总和,但我看不到如何:
df = pd.DataFrame({'A': [1, 1, 2, 1, 2],
'B': [np.nan, 2, 3, 4, 5],
'C': [1, 2, 1, 1, 2]},
columns=['A', 'B', 'C'])
我看不到它是如何计算结果的,它肯定不是对每一行都执行A + B + C。
答案 0 :(得分:1)
您的示例相当糟糕,但让我解释一下。
Groupby是一种操作,它采用列的值并将所有相等的值合并在一起。现在我们需要一个操作来处理其他列。因为与合并程序需要知道如何处理它们。这就是运算总和。 (其他操作:均值,计数...)
在您的情况下,您在B
中仅具有唯一值,因此没有2行合并在一起。因此,一个元素的总和是多少?正是元素。
l = [3]
print(sum(l)) # Output: 3
这就是您的示例中发生的事情。
这就是为什么@jezrael在评论中说您可能想df = df.groupby('A').sum()
输出为:
B C
A
1 6.0 4
2 8.0 3
如您所见,我们按A列分组。第1行和第3行加在一起,第2行和第4行加在一起。
您可能正在寻找:
df.sum()
哪个输出:
A 7.0
B 14.0
C 7.0
或者@Andrea提到了这一点:
df.sum(axis=1)
输出:
0 2.0
1 5.0
2 6.0
3 6.0
4 9.0
但是Groupby是实现我想要的想法的错误方法。
答案 1 :(得分:0)
通过比较以下两个数据帧可以很好地理解这一点:-
让数据框成为
做df.groupby('B').sum()
会得到
同时,做df.groupby('A').sum()
会得到
因此,groupby()。sum()所做的是,它使用B元素,在A和C中添加相应的行元素,然后在B列中搜索该元素的重复项。如果找到,则再次添加相应的A和C值。如果找不到,则跳至B列中的下一个元素。为进一步说明,在上述示例中,首先采用B = 2.0,其中A = 1和C = 2。 B列中未重复2.0,现在移至B = 3.0,对于A = 2和C = 1,依此类推。这是groupby('B')。sum()的输出。另一方面,完成df.groupby('A')时,它首先需要A = 1。为此,相应的值为B = NaN,C =1。由于在A列中重复1,因此sumB = NaN + 2.0 + 4.0 = 6,sumC = 1 + 2 + 1 = 4。完成1则转到A =2。同样,对于A = 2,sumB = 3.0 + 5.0 = 8,sumC = 1 + 2 =3。这说明了groupby('A')完成时的输出。
对于您的问题,df.sum()
将所有3列的总和设为
A 7.0
B 14.0
C 7.0
如果要按行求和,请执行df.sum(axis = 1)
这将给
0 2.0
1 5.0
2 6.0
3 6.0
4 9.0