python通过计算满足条件的行数进行分组

python通过计算满足条件的行数进行分组,python,pandas,group-by,Python,Pandas,Group By,我试图在id列上执行一个groupby,这样我就可以显示col1中等于1的行数 df: 我的代码: df.groupby(['id'])[col1].count()[1] 我得到的输出是2。它没有显示来自其他id的值,比如b 我想: id col1 a 2 b 1 如果可能,每个id的总行数是否也可以显示为新列 例如: id col1 total a 2 3 b 1 1 这是因为id为“a”的行和为3。其中的2个是相同的,这就是为什么它被分组并视为一个

我试图在
id列上执行一个groupby,这样我就可以显示col1中等于1的行数

df:

我的代码:

df.groupby(['id'])[col1].count()[1]
我得到的输出是2。它没有显示来自其他
id
的值,比如b

我想:

id col1
a   2    
b   1 
如果可能,每个id的总行数是否也可以显示为新列

例如:

id col1 total
a   2    3
b   1    1

这是因为id为“a”的行和为3。其中的2个是相同的,这就是为什么它被分组并视为一个,然后它添加了唯一的行,该行在其列1上包含0值。不能将行上具有不同值的行分组


是的,您可以将其添加到输出中。只需在代码的列部分放置一个计算所有行的方法。

假设col1中只有1和0,您可以使用
agg

df.groupby('id', as_index=False)['col1'].agg({'col1': 'sum', 'total': 'count'})

#  id   total   col1
#0  a       3      2
#1  b       1      1

如果您想将解决方案推广到包含col1中不为零的值,可以执行以下操作。这也会正确排列列

df.set_index('id')['col1'].eq(1).groupby(level=0).agg([('col1', 'sum'), ('total', 'count')]).reset_index()

  id  col1  total
0  a   2.0      3
1  b   1.0      1
agg
方法中使用元组,其中第一个值是列名,第二个值是聚合函数,这对我来说是新的。我只是在试验,它似乎起了作用。我不记得在文档中看到过,所以请小心使用

df.set_index('id')['col1'].eq(1).groupby(level=0).agg([('col1', 'sum'), ('total', 'count')]).reset_index()

  id  col1  total
0  a   2.0      3
1  b   1.0      1