【问题标题】:filtering the DataFrame based on condition with Date Column使用日期列根据条件过滤 DataFrame
【发布时间】:2022-10-24 14:04:38
【问题描述】:

现有数据框:

UserId     Activity_date     Status  
A            27-01-2022      initiated        
A            27-01-2022      In_process
A            27-01-2022      Success    
A            28-01-2022      initiated  
A            28-01-2022      Completed
A            30-01-2022      initiated
A            30-01-2022      failed
B            26-01-2022      initiated
B            26-01-2022      Completed
B            26-01-2022      Success
B            27-01-2022      initiated

需要删除那些在同一活动日期未出现“成功”或“已完成”的条目。与 UserId A 的情况一样,Success 状态出现在 27-01-2022 上, Completed 状态出现在 28-01-2022 上,因此新数据框应包含活动日期 27-01-2022 和 28-01- 的所有行2022

预期数据框:

UserId     Activity_date     Status  
A            27-01-2022      initiated        
A            27-01-2022      In_process
A            27-01-2022      Success    
A            28-01-2022      initiated  
A            28-01-2022      Completed
B            26-01-2022      initiated
B            26-01-2022      Completed
B            26-01-2022      Success

我通过 UserId 和 Activity_date 分组来接近它,并检查“成功”或“已完成”状态的行,但被丢弃的部分卡住了。

【问题讨论】:

    标签: pandas


    【解决方案1】:

    尝试:

    df
        UserId  Activity_date   Status
    0   A       27-01-2022  initiated
    1   A       27-01-2022  In_process
    2   A       27-01-2022  Success
    3   A       28-01-2022  initiated
    4   A       28-01-2022  Completed
    5   A       30-01-2022  initiated
    6   A       30-01-2022  failed
    7   B       26-01-2022  initiated
    8   B       26-01-2022  Completed
    9   B       26-01-2022  Success
    10  B       27-01-2022  initiated
    
    df1 = df.groupby(['UserId','Activity_date'])['Status'].apply(list).reset_index()
    
    df1
        UserId  Activity_date   Status
    0   A       27-01-2022      [initiated, In_process, Success]
    1   A       28-01-2022      [initiated, Completed]
    2   A       30-01-2022      [initiated, failed]
    3   B       26-01-2022      [initiated, Completed, Success]
    4   B       27-01-2022      [initiated]
    
    df1.loc[df1['Status'].map(lambda x: ("Success" in x) and ('Completed' in x))].explode('Status')
        UserId  Activity_date   Status
    3   B       26-01-2022      initiated
    3   B       26-01-2022      Completed
    3   B       26-01-2022      Success
    

    【讨论】:

    • 状态可以是完成或成功。如果其中任何一个出现在任何活动日期,那么每一行 w.r.t.必须保留到该活动日期
    • 你说的活动日期是什么意思? 27-01-2022 是与 28-01-2022 不同的活动日期还是相同?
    【解决方案2】:

    df 是您的数据库,我建议使用以下代码:

    df1 = df[df.Status.isin(['Success','Completed'])][['UserId','Activity_date']].drop_duplicates()
    df1.merge(df, how='left',on=['UserId','Activity_date'])
    
    df1:
    
            UserId  Activity_date
    2   A   2022-01-27
    4   A   2022-01-28
    8   B   2022-01-26
    

    【讨论】:

      【解决方案3】:

      这是使用df.pivot 的解决方案。

      out = df.pivot(index=['UserId','Activity_date'], 
                     columns='Status', values='Status')
      
      out = df.set_index(['UserId','Activity_date'])
          .loc[out[['Completed','Success']].any(axis=1)].reset_index(drop=False)
      
      print(out)
      
        UserId Activity_date      Status
      0      A    27-01-2022   initiated
      1      A    27-01-2022  In_process
      2      A    27-01-2022     Success
      3      A    28-01-2022   initiated
      4      A    28-01-2022   Completed
      5      B    26-01-2022   initiated
      6      B    26-01-2022   Completed
      7      B    26-01-2022     Success
      

      解释

      • 枢轴为每个UserId, Activity_date 对与NaN 或适当的值(例如Success)获取每个Status 值的列。
      • 接下来,我们在['Completed','Success'] 上使用df.any 来检查是否至少任一列中的一个包含-NaN 值。结果是带有布尔值的pd.Series
      • 最后,我们使用这个系列从原始df 中选择正确的行,并将UserId, Activity_date 临时设置为索引。

      【讨论】:

        【解决方案4】:

        一定要回答这个问题。提供详细信息并分享您的研究!

        【讨论】:

          猜你喜欢
          • 2014-08-12
          • 2019-04-29
          • 1970-01-01
          • 1970-01-01
          • 2011-12-04
          • 1970-01-01
          • 2016-11-25
          • 2021-07-22
          • 1970-01-01
          相关资源
          最近更新 更多