如果不满足条件,如何使用熊猫删除行

时间:2020-03-24 20:53:05

标签: python pandas

我有以下数据框:

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

做到这一点的最佳方法是什么?

谢谢。

3 个答案:

答案 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)

groupbyfilter

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