Python 熊猫,按计数过滤

Python 熊猫,按计数过滤,python,pandas,lambda,group-by,Python,Pandas,Lambda,Group By,我正试图通过id的出现次数来过滤数据帧 id date 1 2018-05-06 1 2018-05-08 1 2018-05-11 2 2018-06-02 2 2018-06-16 3 2018-06-04 3 2018-06-09 4 2018-06-06 4 2018-06-11 4 2018-06-17 我想过滤出现3次的id值,因此得到的过滤数据框应该如下所示: id date 1

我正试图通过
id
的出现次数来过滤数据帧

id    date
1     2018-05-06
1     2018-05-08
1     2018-05-11
2     2018-06-02
2     2018-06-16
3     2018-06-04
3     2018-06-09
4     2018-06-06
4     2018-06-11
4     2018-06-17
我想过滤出现3次的
id
值,因此得到的过滤数据框应该如下所示:

id    date
1     2018-05-06
1     2018-05-08
1     2018-05-11
4     2018-06-06
4     2018-06-11
4     2018-06-17
我以前试过使用下面的代码,这是我从另一篇StackOverflow文章中得到的。该代码起初是有效的,但大约半小时后我使用它时,它给了我一个错误“lambda不能包含赋值”:


我不知道为什么这段代码以前工作,现在给我这个错误。有什么帮助吗?

我想您需要比较每组的长度:

graphview3 = df.groupby('id').filter(lambda x: len(x) == 3)
或与
size
配合使用:

在您的解决方案中,需要使用double
==
进行比较,更常见的方法是使用exclude
NaN
s作为计数值(但在这里它工作得很好,因为
groupby
默认情况下会在
id
中删除带有
NaN
s的行):


非常感谢。你知道为什么我以前使用的代码在某一点上工作,然后给我“lambda不能包含赋值”错误吗?“@bbk611-当然,在
=3
中只有一个
=
,但是需要
==3
,我真傻。没有意识到这是一个布尔值。谢谢,谢谢!我需要学习如何编写更快、更高效的代码。这个方法比下面的len()和transform()方法快吗?在我的机器上,我的是2.14ms,来自Jezrael的是2.77和2.3。我认为你应该在你的机器上为你的完整数据帧计时&然后决定。
graphview3 = df.groupby('id').filter(lambda x: len(x) == 3)
graphview3 = df[df.groupby('id')['id'].transform('size') == 3]
print (graphview3)
   id        date
0   1  2018-05-06
1   1  2018-05-08
2   1  2018-05-11
7   4  2018-06-06
8   4  2018-06-11
9   4  2018-06-17
graphview3 = df.groupby('id').filter(lambda x: x['id'].count()==3)
graphview3 = df.loc[df['id'].map(df['id'].value_counts()) == 3]