如何筛选groupby对象,以使列值位于某个范围内?

时间:2019-06-23 18:15:05

标签: python pandas dataframe

我有一个数据框分组在列PID上。数据框包含另一列year。我想找出所有存在year > 1990year < 1970的单独记录的PID。

我尝试了以下方法,但是结果不是我期望的:

g = df.groupby('PID')
g.filter(lambda x: ( ((x['year'] < 1970) | (x['year'] > 1990)).all() )

但这包括仅满足两个条件之一的PID。我需要具有<1970年和1990年都有记录的PID。

以下是数据示例:

enter image description here

此数据帧在PID上分组,以生成上面编写的分组对象g

2 个答案:

答案 0 :(得分:0)

d1 = df.loc[df["year"] < 1970, "PID"].drop_duplicates()
output = d1[d1.isin(df.loc[df["year"] > 1990, "PID"])]

答案 1 :(得分:0)

g = df.groupby('PID')
g.filter(lambda x: ((x['year'] < 1970).any() & (x['year'] > 1990).any()))

x['year'] < 1970将返回一个布尔序列,其中将检查该条件下组中的每个记录。我们希望至少出现year < 1970,将由.any()检查。对于条件year > 1990同样。最后,我们希望这两个条件都成立,因此介于两者之间的&