代码之家  ›  专栏  ›  技术社区  ›  John Conor

检查列中是否同时存在开始日期和结束日期,并筛选数据帧-python、panda

  •  0
  • John Conor  · 技术社区  · 1 年前

    我有一个包含多个 IDs Targets 时间跨度为2个月,可在此处获取- https://pastebin.com/UeyZ4uZu

    start_date = '01-01-19'
    end_date = '02-28-19'
    

    我需要过滤掉任何不跨越整个时间段的数据,即 01-01-19 并且有关于 02-28-19 。不需要每天都有数据。例如,在此处的示例数据集中:

    df = pd.DataFrame({'names':['jim','jim','jim','jim','jim','jim','jim','jim','jim',
                               'bob','bob','bob','bob','bob','bob',
                               'sara','sara','sara','sara','sara','sara','sara','sara','sara','sara'],
                      'dates':['01-01-19','01-02-19','01-03-19','01-05-19','01-06-19','01-07-19','01-08-19','01-09-19','01-10-19',
                               '01-05-19','01-06-19','01-07-19','01-08-19','01-09-19','01-10-19',
                               '01-01-19','01-02-19','01-03-19','01-04-19','01-05-19','01-06-19','01-07-19','01-08-19','01-09-19','01-10-19']})
    

    jim sara 即使 吉姆 缺少 01-04-19 bob 将被删除,因为他没有 1990年1月1日 。我之前在这里问过一个类似的问题: Filer by Dates that Start After a Specific Time - pandas, python ,得到了解决方案:

    start = df.Date.min() 
    end = df.Date.max()
    num_days = (end - start).days + 1
    
    # If start/end is fixed date and not by min/max, 
    # add filter to make sure it won't start/end on the wrong dates
    # df = df[(df.Date >= start) & (df.Date <= end)]
    
    df = df.loc[df.groupby('ID').Date.transform('nunique') == num_days]
    

    根据所问的问题,这是正确的,但我意识到这是在过滤掉我需要保留的额外数据。主要目标是保留 start_date end_date 扔掉任何没有书尾的东西。

    大致如下:

    dfin = df.loc[df.groupby('ID').Date.isin([start_date,end_date])]
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   Michael Cao    1 年前

    假设实际数据中有行的数据在结束日期,则可以使用逐组转换,添加每个名称组的第一个和最后一个日期的列,并使用这些列进行筛选。

    以下示例修改了数据,以便Jim和Sara在2月底获得数据:

    df = pd.DataFrame({'names':['jim','jim','jim','jim','jim','jim','jim','jim','jim',
                               'bob','bob','bob','bob','bob','bob',
                               'sara','sara','sara','sara','sara','sara','sara','sara','sara','sara', 'jim', 'sara'],
                      'dates':['01-01-19','01-02-19','01-03-19','01-05-19','01-06-19','01-07-19','01-08-19','01-09-19','01-10-19',
                               '01-05-19','01-06-19','01-07-19','01-08-19','01-09-19','01-10-19',
                               '01-01-19','01-02-19','01-03-19','01-04-19','01-05-19','01-06-19','01-07-19','01-08-19','01-09-19','01-10-19', '02-28-19', '02-28-19']})
    
    df['dates'] = pd.to_datetime(df['dates'], format = '%m-%d-%y')
    
    df['first_date'] = df.groupby('names')[['dates']].transform('min')
    df['last_date'] = df.groupby('names')[['dates']].transform('max')
    
    start_date = '01-01-19'
    end_date = '02-28-19'
    
    df2 = df.loc[(df['first_date'] <= start_date) & (df['last_date'] >= end_date)]