【问题标题】:Select data when specific columns have null value in pandas当特定列在熊猫中具有空值时选择数据
【发布时间】:2017-03-17 10:46:50
【问题描述】:

我有一个数据框,其中有 2 个日期字段我想过滤并在任何一个日期字段为空时查看行。

ID          Date1       Date2
58844880    04/11/16    NaN
59745846    04/12/16    04/14/16
59743311    04/13/16    NaN
59745848    04/14/16    04/11/16
59598413    NaN         NaN
59745921    04/14/16    04/14/16
59561199    04/15/16    04/15/16
NaN         04/16/16    04/16/16
59561198    NaN         04/17/16

它应该如下所示

ID          Date1       Date2
58844880    04/11/16    NaN
59743311    04/13/16    NaN
59598413    NaN         NaN
59561198    NaN         04/17/16

试过代码 df = (df['Date1'].isnull() | df['Date1'].isnull())

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    试试这个:

    In [7]: df[df.filter(like='Date').isnull().any(1)]
    Out[7]:
               ID     Date1     Date2
    0  58844880.0  04/11/16       NaN
    2  59743311.0  04/13/16       NaN
    4  59598413.0       NaN       NaN
    8  59561198.0       NaN  04/17/16
    

    【讨论】:

      【解决方案2】:

      使用boolean indexing:

      mask = df['Date1'].isnull() | df['Date2'].isnull()
      print (df[mask])
                 ID     Date1     Date2
      0  58844880.0  04/11/16       NaN
      2  59743311.0  04/13/16       NaN
      4  59598413.0       NaN       NaN
      8  59561198.0       NaN  04/17/16
      

      时间安排

      #[900000 rows x 3 columns]
      df = pd.concat([df]*100000).reset_index(drop=True)
      
      In [12]: %timeit (df[df['Date1'].isnull() | df['Date2'].isnull()])
      10 loops, best of 3: 89.3 ms per loop
      
      In [13]: %timeit (df[df.filter(like='Date').isnull().any(1)])
      10 loops, best of 3: 146 ms per loop
      

      【讨论】:

      • 感谢您的解决方案有效,也感谢您分享两种解决方案的比较时间
      【解决方案3】:

      快速查看任一列是否有空值

      df.isnull().any()
      

      计算具有任何空值的行

      df.isnull().sum()
      

      获取空值行

      (1) 创建空值真值表 (即在每个列/单元格中创建具有真/假的数据框,根据它是否具有空值)

      truth_table = df.isnull()
      

      (2) 创建真值表,最终显示哪些行具有任何空值

      conclusive_truth_table = truth_table.any(axis='columns')
      

      (3) 隔离/显示具有任何空值的行

      df[conclusive_truth_table]
      

      (1)-(3) 放在一起

      df[df.isnull().any(axis='columns')]
      

      或者

      隔离任何指定列中具有空值的行

      df.loc[:,['Date1','Date2']].isnull().any(axis='columns')
      

      隔离在两个指定列中都具有空值的行

      df[ df.loc[ :,['Date1','Date2'] ].isnull().sum(axis=1) == 2]
      

      【讨论】:

      猜你喜欢
      • 2015-03-29
      • 2018-05-20
      • 2020-08-01
      • 1970-01-01
      • 2022-01-21
      • 2021-12-05
      • 2013-06-29
      • 2021-07-17
      • 2016-08-27
      相关资源
      最近更新 更多