![](/img/trans.png)
[英]Pandas groupby two columns and only keep records satisfying condition based on count
[英]python pandas groupby then count rows satisfying condition
我正在尝试对id column
进行分组,以便我可以显示 col1 中等于 1 的行数。
df:
id col1 col2 col3
a 1 1 1
a 0 1 1
a 1 1 1
b 1 0 1
我的代码:
df.groupby(['id'])[col1].count()[1]
我得到的输出是 2。它没有向我显示其他ids
的值,比如 b。
我想要:
id col1
a 2
b 1
如果可能的话,每个 id 的总行数也可以显示为新列吗?
例子:
id col1 total
a 2 3
b 1 1
假设 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
这是因为您的 id 为 'a' 的行总和为 3。其中 2 个是相同的,这就是为什么它被分组并被视为一个的原因,然后它添加了包含 0 值的唯一行 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
方法中使用元组,其中第一个值是列名,第二个值是聚合函数对我来说是新的。 我只是在试验,它似乎奏效了。 我不记得在文档中看到过它,所以请谨慎使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.