试图理解pandas中的groupby()和sum()
我对groupby()的理解是,所选列作为索引对其余列进行分组 所以如果我有试图理解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
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看作一个列。