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==
进行比较,更常见的方法是使用excludeNaN
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]