基于Plant-Part组合的多Action数据去重处理需求求助
解决方案
针对你提出的分组筛选需求,以下是两种常用工具的实现方式:
SQL 实现
利用窗口函数标记每个Plant-Part组是否包含目标动作(Action4),再基于标记筛选符合要求的记录:
WITH group_flags AS ( SELECT Plant, Part, Action, -- 标记当前组是否存在Action4 MAX(CASE WHEN Action = 'Action4' THEN 1 ELSE 0 END) OVER (PARTITION BY Plant, Part) AS has_action4 FROM your_table ) SELECT Plant, Part, Action FROM group_flags WHERE -- 组内无Action4则保留所有记录 has_action4 = 0 -- 组内有Action4则仅保留Action4的记录 OR (has_action4 = 1 AND Action = 'Action4');
Python Pandas 实现
通过分组转换标记组内是否存在目标动作,再进行筛选:
import pandas as pd # 假设数据已加载到DataFrame中 df = pd.DataFrame({ 'Plant': [101]*8, 'Part': [123]*4 + [124]*2 + [125]*2, 'Action': ['Action1','Action2','Action3','Action4','Action2','Action4','Action1','Action2'] }) # 给每行标记所在Plant-Part组是否包含Action4 df['has_action4'] = df.groupby(['Plant', 'Part'])['Action'].transform(lambda x: 'Action4' in x.values) # 筛选符合条件的记录并移除辅助列 result_df = df[(~df['has_action4']) | (df['Action'] == 'Action4')].drop('has_action4', axis=1) print(result_df)
两种方法核心逻辑一致:先识别每个分组是否存在目标动作,再根据识别结果保留对应记录,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Jakob Orel
相关产品推荐
相关产品推荐

