熊猫,按数量过滤

时间:2019-09-11 07:46:14

标签: 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     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)

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

2 个答案:

答案 0 :(得分:2)

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

graphview3 = df.groupby('id').filter(lambda x: len(x) == 3)

或将sizeGroupBy.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]