我有以下数据框:
ID Days TreatmentGiven TreatmentNumber
--- ---- -------------- ---------------
1 0 False NaN
1 30 False NaN
1 40 True 1.0
1 56 True 2.0
2 0 False NaN
2 14 True 4.0
2 28 True 5.0
3 0 False NaN
3 28 True 1.0
3 56 True 2.0
4 0 False NaN
4 100 True 6.0
4 128 True 7.0
我想删除ID不具有TreatmentNumber == 1.0的ID的所有行,以便得到以下结果:
ID Days TreatmentGiven TreatmentNumber
--- ---- -------------- ---------------
1 0 False NaN
1 30 False NaN
1 40 True 1.0
1 56 True 2.0
3 0 False NaN
3 28 True 1.0
3 56 True 2.0
做到这一点的最佳方法是什么?
谢谢。
答案 0 :(得分:3)
您可以使用groupby().transform()
:
df[df.TreatmentNumber.eq(1).groupby(df['ID']).transform('any')]
输出:
ID Days TreatmentGiven TreatmentNumber
0 1 0 False NaN
1 1 30 False NaN
2 1 40 True 1.0
3 1 56 True 2.0
7 3 0 False NaN
8 3 28 True 1.0
9 3 56 True 2.0
答案 1 :(得分:2)
groupby
和filter
df.groupby('ID').filter(lambda d: d.TreatmentNumber.eq(1).any())
ID Days TreatmentGiven TreatmentNumber
0 1 0 False NaN
1 1 30 False NaN
2 1 40 True 1.0
3 1 56 True 2.0
7 3 0 False NaN
8 3 28 True 1.0
9 3 56 True 2.0
答案 2 :(得分:0)
我们可以使用isin
和一个布尔值来找到您的ID
ids = df.loc[df['TreatmentNumber'].eq(1)]['ID'].unique()
df1 = df.loc[df['ID'].isin(ids)]
print(df1)
ID Days TreatmentGiven TreatmentNumber
0 1 0 False NaN
1 1 30 False NaN
2 1 40 True 1.0
3 1 56 True 2.0
7 3 0 False NaN
8 3 28 True 1.0
9 3 56 True 2.0