我正在尝试根据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: x['id'].count()=3)
我不知道为什么这段代码以前有效,现在却给我这个错误。有什么帮助吗?
答案 0 :(得分:2)
我认为您需要比较每组的长度:
graphview3 = df.groupby('id').filter(lambda x: len(x) == 3)
或将size
与GroupBy.transform
一起使用boolean indexing
:
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
在您的解决方案中,需要使用双==
进行比较,更常见的Series.count
也用于包含排除NaN
的计数值(但在这里它工作得很好,因为groupby
默认情况下,在NaN
中删除带有id
的行):
graphview3 = df.groupby('id').filter(lambda x: x['id'].count()==3)
答案 1 :(得分:1)
graphview3 = df.loc[df['id'].map(df['id'].value_counts()) == 3]