【问题标题】:Drop index given criteria on multiple rows在多行上删除给定条件的索引
【发布时间】:2019-08-08 01:01:11
【问题描述】:

当满足特定条件时,我试图删除属于给定索引的行。在这种情况下,我想在属于该索引的所有值都是 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 而不是 all 属于 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

提前致谢。

【问题讨论】:

  • 拥有NaT 行是什么意思?一行的所有列都是NaT 还是任何一列都是NaT?请举个例子,删除一些行
  • 属于索引 003 的两行都被删除,我可以在应用 dropna 方法之前添加原始数据帧。我的意思是所有 colmun 都是 NaT,我也会编辑它。感谢您的回复。

标签: python pandas filter


【解决方案1】:

您应该在 id 上分组,在这种情况下为 level 0,然后检查 all 该组的行是否为 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

【讨论】:

    【解决方案2】:

    您可以使用transformmax

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

                     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
    

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多