代码之家  ›  专栏  ›  技术社区  ›  Rahul Agarwal

比较日期并用条件筛选组中的行

  •  0
  • Rahul Agarwal  · 技术社区  · 7 年前

    ID   Name        Price     Date             Fit_Test
    1    Apple         10      2018-01-15          Super_Fit
    2    Apple         10      2018-01-15          Super_Fit
    3    Apple         10      2019-01-15          Super_Fit
    
    4    Orange        12      2019-02-15          Not_Fit
    5    Orange        12      2018-09-25          Not_Fit
    6    Orange        12      NaT                 Not_Fit
    7    Orange        12      2028-01-25          Not_Fit
    
    8    Banana        15      2019-12-25          Medium_Fit
    9    Banana        15      NaT                 Medium_Fit
    
    10   Cherry         30     2021-06-23          Super_Fit
    
    11   PineAp         30     2023-02-03          Medium_Fit
    12   PineAp         30     2020-12-13          Medium_Fit
    

    预期测向:

    ID   Name        Price     Date             Fit_Test
    1    Apple         10      2018-01-15          Super_Fit
    2    Apple         10      2018-01-15          Super_Fit
    3    Apple         10      2019-01-15          Super_Fit
    
    7    Orange        12      2028-01-25          Not_Fit
    
    8    Banana        15      2019-12-25          Medium_Fit
    9    Banana        15      NaT                 Medium_Fit
    
    10   Cherry         30     2021-06-23          Super_Fit
    
    11   PineAp         30     2023-02-03          Medium_Fit
    

    我想 group-by Name Price 然后根据 Date Fit_Test 作为条件列。

    1. 如果适合测试 Super_Fit (第1、2、3和10行的输入和预期DF相同)

    2. 姓名 价格 没有 NaT 然后在该组中比较日期,以

    3. 姓名 价格 条件和拟合测试不是 超级合身 纳特 在该组中:

      3.1如果该组中的计数大于2,则比较日期,以 最高的约会,留着吧

      3.2如果该组中的计数等于2,则保留两行** (ID 8,9和预期的8,9在那里)**

    0 回复  |  直到 7 年前
        1
  •  2
  •   jezrael    7 年前

    使用:

    df['Date'] = pd.to_datetime(df['Date'])
    
    m1 = df['Fit_Test'].eq('Super_Fit').groupby([df['Name'],df['Price']]).transform('all')
    
    m2 = df['Date'].notna().groupby([df['Name'],df['Price']]).transform('all')
    
    m22 = df['Date'].eq(df.groupby(['Name', 'Price'])['Date'].transform('max'))
    
    m3 = df.groupby(['Name', 'Price'])['Date'].transform('size').eq(2)
    
    df = df[m1 | (m2 & m22) | (~m2 & m3) | (~m2 & m22)]
    #it seems conditions should be simplify
    #df = df[m1 | m22 | (~m2 & m3)]
    print (df)
        ID    Name  Price       Date    Fit_Test
    0    1   Apple     10 2018-01-15   Super_Fit
    1    2   Apple     10 2018-01-15   Super_Fit
    2    3   Apple     10 2019-01-15   Super_Fit
    6    7  Orange     12 2028-01-25     Not_Fit
    7    8  Banana     15 2019-12-25  Medium_Fit
    8    9  Banana     15        NaT  Medium_Fit
    9   10  Cherry     30 2021-06-23   Super_Fit
    10  11  PineAp     30 2023-02-03  Medium_Fit