首页 > 解决方案 > 根据 2 个条件选择组的行,但结合该组的唯一类别

问题描述

我有一张如下表

ID    Date         Category      Cycles      
--------------------------------------------
RYI19  6/12/2018    TEMPERATURE   1567    y   
RYI19  6/13/2018    VOLUME        1620    n
RYI19  6/25/2018    AREA          1890    y    
RYI19  6/28/2018    TEMPERATURE   1435    y
TYI23  5/10/2020    LENGTH        1567    Y
TYI23  6/12/2020    LENGTH        1678    Y
TYI23  6/13/2020    LENGTH        1689    n

在我唯一的条件是从组中选择第一个之前

所以我写了这段代码:

 select 
     ID, date 
 from 
     (select 
          ID, date, 
          row_number() over(partition by ID order by date) rn 
      from 
          table1) t1 
where 
    rn = 1

现在我有 2 个额外的列和 2 个条件,如果该组在 2 天内并且周期小于 100,则不要考虑该记录。理想情况下,周期需要随着日期的增加而增加,但如果它更小,则只需要考虑 2 天的日期条件来选择或不选择记录。就类别而言,当不考虑记录时,它需要结合所有独特的类别。如果日期相同,则需要选择其中一个。

ID     Date         Category              Cycles      
-------------------------------------------------
RYI19  6/12/2018    TEMPERATURE & VOLUME   1567      
RYI19  6/25/2018    AREA                   1890        
RYI19  6/28/2018    TEMPERATURE            1435   
TYI23  5/10/2020    LENGTH                 1567   
TYI23  6/12/2020    LENGTH                 1678   

我需要确保字段中只有唯一的类别 - 请注意,最后一条记录在类别中没有 LENGTH 两次。

编辑:明确添加规则 1)如果日期在 2 天内或周期在 100 个周期内,则删除非 VOLUME 记录,但如果类别均为 VOLUME 或均为 NON VOLUME 记录,则显示之前的日期记录。

2)如果温度类别是在体积记录之前 10 天,那么也只考虑体积记录,即标记要删除/过滤的温度记录。

3)如果日期之一是在 12 月,那么如果类别不同,则考虑 30 天的差异。

  ID      Date       Category     Cycles
 RPI100   8/7/2020   Volume       4327
 RPI100   8/18/2020  TEMPERATURE  4300
 RDY234   6/1/2020   VOLUME       7014
 RDY234   6/4/2020   TEMERATURE   7014
 PDI23    8/3/2020   VOLUME       9799
 PDI23    9/28/2020  TEMERATURE   12968
 PDI23    10/6/2020  VOLUME       13398
 F128     2/25/2020  TEMERATURE   9875
 YU567    12/2/2020  VOLUME       7403
 YU567    12/3/2020  VOLUME       7436
 RTY78    8/17/2020  STATE        3198
 TYI12    1/27/2020  VOLUME       6145
 RPI145   12/16/2019 VOLUME       2110
 RPI145    1/23/2020 TEMPERATURE  0   

在此处输入图像描述

标签: pandaspysparkjupyter

解决方案


Something like this should do the trick

df.groupby(['id', 'date', 'cycles']).agg({"Category": " & ".join})

推荐阅读