如何处理重复记录:同组重复行Value首行留原值其余设为0?
实现重复组内仅首行保留Value原值,其余置0的方法
原始数据
ID DATE1 DATE2 Value 1 10JAN2019 10FEB2019 1 1 10JAN2019 10FEB2019 1 2 01MAR2020 15MAY2020 0 3 11MAR2022 18JUN2021 1 3 11MAR2022 18JUN2021 1 3 11MAR2022 18JUN2021 1
目标数据
ID DATE1 DATE2 Value 1 10JAN2019 10FEB2019 1 1 10JAN2019 10FEB2019 0 2 01MAR2020 15MAY2020 0 3 11MAR2022 18JUN2021 1 3 11MAR2022 18JUN2021 0 3 11MAR2022 18JUN2021 0
可以用以下几种常见方法实现需求:
方法一:SQL(支持窗口函数的数据库,如MySQL 8.0+、PostgreSQL、SQL Server等)
利用ROW_NUMBER()窗口函数,按ID、DATE1、DATE2分组后给每组内的行编号,仅保留首行的原Value,其余行设为0:
SELECT ID, DATE1, DATE2, CASE WHEN ROW_NUMBER() OVER (PARTITION BY ID, DATE1, DATE2 ORDER BY (SELECT NULL)) = 1 THEN Value ELSE 0 END AS Value FROM your_table_name;
注:ORDER BY (SELECT NULL)是为了保留数据原有顺序,若需要按特定字段排序调整行号,替换成对应的字段即可。
方法二:Python Pandas
通过duplicated()函数标记重复组内的非首行,再将这些行的Value设为0:
import pandas as pd # 构造示例DataFrame(实际场景可从文件/数据库读取) df = pd.DataFrame({ 'ID': [1,1,2,3,3,3], 'DATE1': ['10JAN2019','10JAN2019','01MAR2020','11MAR2022','11MAR2022','11MAR2022'], 'DATE2': ['10FEB2019','10FEB2019','15MAY2020','18JUN2021','18JUN2021','18JUN2021'], 'Value': [1,1,0,1,1,1] }) # 标记重复组内的非首行 mask = df.duplicated(subset=['ID', 'DATE1', 'DATE2'], keep='first') # 将标记行的Value设为0 df.loc[mask, 'Value'] = 0 print(df)
内容的提问来源于stack exchange,提问作者NewUsr_stat
相关产品推荐
相关产品推荐

