Python 在多行上删除给定条件的索引

Python 在多行上删除给定条件的索引,python,pandas,filter,Python,Pandas,Filter,我试图在满足特定条件时删除属于给定索引的行。在本例中,我希望在属于该索引的所有值都是NaT时删除该索引 我尝试过使用以下代码,但dropna方法无法解决问题 import pandas as pd df_dict = {'id':['001','002','002','003','003'],'req_dat':['2018-11-20','2018-12-13','2018-12-23','2018-12-27','2018-12-30'],'app_date':['2018-1

我试图在满足特定条件时删除属于给定索引的行。在本例中,我希望在属于该索引的所有值都是NaT时删除该索引

我尝试过使用以下代码,但dropna方法无法解决问题

   import pandas as pd 
   df_dict = {'id':['001','002','002','003','003'],'req_dat':['2018-11-20','2018-12-13','2018-12-23','2018-12-27','2018-12-30'],'app_date':['2018-11-21','NaT','2018-12-24','NaT','NaT'],'can_date':['2019-02-21','NaT','2019-01-25','NaT','NaT']} 
   df = pd.DataFrame.from_dict(df_dict)
   df1 = df.set_index(['id','req_dat'])
   df2 = df1.dropna(how='all')
这是原始数据帧:

                  app_date    can_date
id  req_dat
001 2018-11-20  2018-11-21  2019-02-21
002 2018-12-13         NaT         NaT
    2018-12-23  2018-12-24  2019-01-25
003 2018-12-27         NaT         NaT
    2018-12-30         NaT         NaT
我得到了这个结果:

                  app_date    can_date
id  req_dat
001 2018-11-20  2018-11-21  2019-02-21
002 2018-12-23  2018-12-24  2019-01-25
我希望这样,req_dat=2018-12-13的行不会被删除,因为它属于id=002而不是所有属于id=002的行都是NaT,因此不应该删除任何行:

                  app_date    can_date
id  req_dat
001 2018-11-20  2018-11-21  2019-02-21
002 2018-12-13         NaT         NaT
    2018-12-23  2018-12-24  2019-01-25

提前感谢。

您应该在
id
上分组,在这种情况下
级别0
,然后检查
该组的所有行是否都是
NaT
。然后使用布尔索引来保留并非全部
NaT
的行:

m  = df.set_index(['id', 'req_dat']).groupby(level=0).transform(lambda x: x.isna().all()).all(axis=1)
df[~m.values]
输出

    id     req_dat   app_date   can_date
0  001  2018-11-20 2018-11-21 2019-02-21
1  002  2018-12-13        NaT        NaT
2  002  2018-12-23 2018-12-24 2019-01-25

您可以执行
变换
最大值

df1[df1.groupby(level=0).transform('max').notna().all(1)]


拥有
NaT
行意味着什么?所有列都是
NaT
的行,或者任何列都是
NaT
?请举一个例子,其中一些行被删除,而属于索引003的行被删除,我可以在应用dropna方法之前添加原始数据帧。我的意思是所有的Colmun都是NaT,我也会编辑它。谢谢你的回复。
                 app_date   can_date
id    req_dat                         
 1  2018-11-20 2018-11-21 2019-02-21
 2  2018-12-13        NaT        NaT
    2018-12-23 2018-12-24 2019-01-25