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