试图理解pandas中的groupby()和sum()

试图理解pandas中的groupby()和sum(),pandas,Pandas,我对groupby()的理解是,所选列作为索引对其余列进行分组 所以如果我有 import pandas as pd df = pd.DataFrame([[0, 1, 3],[3, 1, 1],[3, 0, 0],[2, 3, 3],[2, 1, 0]], columns=list('xyz')) gby = df.groupby('x') df: x y z 0 0 1 3 1 3 1 1 2 3 0 0 3 2 3 3 4 2 1 0 我对g

我对groupby()的理解是,所选列作为索引对其余列进行分组

所以如果我有

import pandas as pd  
df = pd.DataFrame([[0, 1, 3],[3, 1, 1],[3, 0, 0],[2, 3, 3],[2, 1, 0]], columns=list('xyz'))
gby = df.groupby('x')

df:
   x  y  z
0  0  1  3
1  3  1  1
2  3  0  0
3  2  3  3
4  2  1  0
我对groupby结果的概念模型是

  y z
x 
0 1 3
2 3 3
  1 0
3 1 1
  0 0
其中列为[y,z],x为索引

所以如果我表演

ap = gby.apply(pd.DataFrame.sum)
我希望这次的回归是正确的

    y  z
x 
0   1  3
2   4  3
3   1  1
相反,它又回来了

x         
0  0  1  3
2  4  4  3
3  6  1  1
在数据框中仍然包含x列的地方,有人能解释一下我遗漏了什么吗

在数据框中仍然包含x列的地方,有人能解释一下我遗漏了什么吗

我认为这是预期的,因为使用所有列,所以如果使用
pd.DataFrame.sum
它将创建新列
x
,并将
x
转换为索引:

def f(x):
    print (x)
    print (x.sum())
    return x.sum()

   x  y  z
0  0  1  3
x    0
y    1
z    3
dtype: int64
   x  y  z
3  2  3  3
4  2  1  0
x    4
y    4
z    3
dtype: int64
   x  y  z
1  3  1  1
2  3  0  0
x    6
y    1
z    1
dtype: int64

ap = gby.apply(f)
print (ap)
   x  y  z
x         
0  0  1  3
2  4  4  3
3  6  1  1
ap = gby.sum()
print (ap)
   y  z
x      
0  1  3
2  4  3
3  1  1
如果默认情况下使用
sum
函数,则忽略用于分组的列-仅将
x
设置为索引:

def f(x):
    print (x)
    print (x.sum())
    return x.sum()

   x  y  z
0  0  1  3
x    0
y    1
z    3
dtype: int64
   x  y  z
3  2  3  3
4  2  1  0
x    4
y    4
z    3
dtype: int64
   x  y  z
1  3  1  1
2  3  0  0
x    6
y    1
z    1
dtype: int64

ap = gby.apply(f)
print (ap)
   x  y  z
x         
0  0  1  3
2  4  4  3
3  6  1  1
ap = gby.sum()
print (ap)
   y  z
x      
0  1  3
2  4  3
3  1  1
但如果在
groupby
之后明确指定sum列,则不排除:

ap = gby['x','y','z'].sum()
print (ap)
   x  y  z
x         
0  0  1  3
2  4  4  3
3  6  1  1    
完全合乎逻辑

df.groupby('x')
有三个组:x=0、x=2和x=3(x的不同值)


当您使用
sum()
进行聚合时,您将得到这三个组中每个组的
y
z
的总数。

谢谢您的回答。我想我的困惑是,在这种情况下,x列变成了索引列,而apply()不会在索引列上执行。我还是误解了吗?@user3562812-我在这里添加了更好的
apply
-示例
groupby
x
转换为索引,但也对
x
值求和,因为
apply
处理所有列
x,y,z
非常感谢。我想我现在的困惑是X不再是GROMPY中的一个列,所以Apple()不会把X看作一个列。