存在如下数据框:
id year number
1 2016 3
1 2017 5
2 2016 1
2 2017 5
...
我想提取2016年和2017年中groupby id且number列的值大于3的行。
例如,在上面的前4行中,结果是:
id year number
1 2016 3
1 2017 5
谢谢!
>>> great_in_both_years = df.groupby("id").apply(lambda x: (x["number"] >= 3).all())
>>> great_in_both_years
id
1 True
2 False
dtype: bool
>>> df.loc[lambda x: x["id"].map(great_in_both_years)]
id year number
0 1 2016 3
1 1 2017 5
比较>=3
,对于与原始尺寸相同的系列使用GroupBy.transform
,因此可以通过GroupBy.transform
进行过滤:
boolean indexing
或使用boolean indexing
,但如果是大型DataFrame或有许多组,它应该比较慢:
df1 = df[(df["number"] >= 3).groupby(df["id"]).transform('all')]
#alternative for reassign mask to column
#df = df[df.assign(number= df["number"] >= 3).groupby("id")['number'].transform('all')]
print (df1)
id year number
0 1 2016 3
1 1 2017 5