根据 2 个条件选择组的行,但结合该组的唯一类别

Posted

技术标签:

【中文标题】根据 2 个条件选择组的行,但结合该组的唯一类别【英文标题】:Select the rows of the group based on 2 conditions but combine the unique categories of that group 【发布时间】:2021-02-18 20:07:43 【问题描述】:

我有一张像下面这样的表格

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   

【问题讨论】:

你在 Pandas 数据框中使用这个吗? 是的,作为熊猫数据框 只是为了确认:当你想对给定的行进行分组时,你想为DateCycle取第一个值吗? (就像你对TEMPERATURE & VOLUME 行所做的那样) 另外,您能否阐明处理“循环数小于 100”的条件?如果两个日期之间的差异小于 2 但周期之间的差异 > 100 会发生什么? 编辑示例解释了应用了哪些规则 【参考方案1】:

这样的事情应该可以解决问题

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

【讨论】:

如何确保满足日期条件和周期条件以及类别也只需要唯一值

以上是关于根据 2 个条件选择组的行,但结合该组的唯一类别的主要内容,如果未能解决你的问题,请参考以下文章

根据表中每个组的唯一列选择行

如何根据条件选择每个组的 x 或 y 成员

根据 3 到 4 个条件对数据库表中的行进行计数和分组查询

比较响应每个组的不同类别的值(使用 groupby)

如何根据第一个下拉列表的选择过滤第二个下拉列表? - 角

结合javascript函数一起工作