如何在多时段多地点的物质测量数据中检测重复值
检测同一地点、日期下的重复物质测量数据
需求说明
需要在包含Location_ID、Substance、date字段的物质测量数据集中,编写代码检测:同一Location_ID且同一date下是否存在重复的Substance。
- 若无重复,输出
No duplicate found - 若有重复,输出
duplicate found并列出所有重复行
数据集示例
| Location_ID | Substance | date |
|---|---|---|
| 1 | A | 16.02.2021 |
| 2 | A | 18.02.2021 |
| 1 | A | 17.02.2021 |
| 2 | B | 18.02.2021 |
| 1 | B | 19.02.2021 |
| 2 | A | 18.02.2021 |
| 1 | C | 17.02.2021 |
| 2 | C | 18.02.2021 |
方法1:基础循环实现(适合新手理解逻辑)
代码实现
# 模拟从文件/数据库读取的数据集 data = [ {"Location_ID": 1, "Substance": "A", "date": "16.02.2021"}, {"Location_ID": 2, "Substance": "A", "date": "18.02.2021"}, {"Location_ID": 1, "Substance": "A", "date": "17.02.2021"}, {"Location_ID": 2, "Substance": "B", "date": "18.02.2021"}, {"Location_ID": 1, "Substance": "B", "date": "19.02.2021"}, {"Location_ID": 2, "Substance": "A", "date": "18.02.2021"}, {"Location_ID": 1, "Substance": "C", "date": "17.02.2021"}, {"Location_ID": 2, "Substance": "C", "date": "18.02.2021"}, ] # 存储已出现的(地点,日期,物质)组合及对应行数据 seen = {} duplicate_rows = [] # 遍历每一行数据 for row in data: # 生成唯一标识键:三个字段的组合 key = (row["Location_ID"], row["date"], row["Substance"]) if key in seen: # 若组合已存在,将当前行和之前的行都加入重复列表 if seen[key] not in duplicate_rows: duplicate_rows.append(seen[key]) duplicate_rows.append(row) else: # 若组合未出现,记录到字典中 seen[key] = row # 输出检测结果 if duplicate_rows: print("duplicate found") print("重复行如下:") for row in duplicate_rows: print(f"Location_ID: {row['Location_ID']}, Substance: {row['Substance']}, date: {row['date']}") else: print("No duplicate found")
代码解释
- 数据模拟:把表格数据转为列表字典格式,这是新手易理解的基础数据结构。
- 记录已出现组合:用
seen字典存储已见过的(地点,日期,物质)组合,键为组合本身,值为对应行数据。 - 遍历检测重复:
- 每行生成唯一
key,包含三个核心字段 - 若
key已在seen中,说明是重复项,将当前行和之前存储的行都加入重复列表 - 若
key未出现,则将当前行存入字典
- 每行生成唯一
- 结果输出:根据重复列表是否为空,输出对应提示和重复行。
方法2:用Pandas实现(高效简洁,适合实际项目)
如果处理大型数据集,用Pandas会更高效,代码也更简洁。
代码实现
import pandas as pd # 将数据集转为Pandas表格格式 df = pd.DataFrame([ {"Location_ID": 1, "Substance": "A", "date": "16.02.2021"}, {"Location_ID": 2, "Substance": "A", "date": "18.02.2021"}, {"Location_ID": 1, "Substance": "A", "date": "17.02.2021"}, {"Location_ID": 2, "Substance": "B", "date": "18.02.2021"}, {"Location_ID": 1, "Substance": "B", "date": "19.02.2021"}, {"Location_ID": 2, "Substance": "A", "date": "18.02.2021"}, {"Location_ID": 1, "Substance": "C", "date": "17.02.2021"}, {"Location_ID": 2, "Substance": "C", "date": "18.02.2021"}, ]) # 筛选出所有重复行:按三个字段判断,keep=False标记所有重复行 duplicates = df[df.duplicated(subset=["Location_ID", "date", "Substance"], keep=False)] # 输出检测结果 if not duplicates.empty: print("duplicate found") print("重复行如下:") print(duplicates) else: print("No duplicate found")
代码解释
- 导入Pandas:先通过
pip install pandas安装库,它是Python处理表格数据的常用工具。 - 创建DataFrame:将数据转为Pandas表格格式,方便快速操作。
- 检测重复行:
df.duplicated(subset=["Location_ID", "date", "Substance"], keep=False):返回布尔序列,标记所有重复行- 用该序列筛选出所有重复行,存入
duplicates
- 结果输出:判断重复行表格是否为空,输出对应提示和重复行。
输出结果示例
两种方法运行后都会输出:
duplicate found 重复行如下: Location_ID Substance date 1 2 A 18.02.2021 5 2 A 18.02.2021
内容的提问来源于stack exchange,提问作者heule
相关产品推荐
相关产品推荐

