趋近智
有时,重复记录并非是另一行在所有列上的精确复制。相反,重复可能指的是只有某些特定列的值完全相同。以客户订单数据集为例。您可能因为同一客户在不同时间下了不同订单,而有该客户(由customer_id标识)的多条记录。尽管order_id或order_date可能不同,但如果您要计算独立客户数量,这些行根据customer_id代表的是同一个实体。
识别这些“部分”重复项对于许多分析非常重要。如果您在分析独立客户数量、网站用户会话或单独的产品条目,您需要在为特定情况定义唯一性的列中寻找重复。忽略这一点可能导致计数虚高、统计数据偏差以及错误的结论。例如,如果您将每条订单记录都视为一个单独的客户,那么计算每个客户的平均订单价值将是不准确的。
第一步是确定哪个列或哪些列的组合能够独立标识您关注的实体。这个决定很大程度上取决于您的数据集和分析目标。
user_id或email列通常作为独立标识符。product_sku或isbn可能标识独立产品。session_id和user_id之类的组合可能定义一个独立的会话。first_name、last_name和date_of_birth等多个列来确立唯一性,尤其是在没有单独ID列的情况下。仔细考虑针对您的特定任务,什么才构成唯一记录。
大多数数据分析库都提供了简单的方法来根据列的子集检查重复项。我们来看看如何使用流行的Python库pandas来完成此操作。
假设您有一个这样的DataFrame:
| customer_id | name | signup_date | last_purchase |
|---|---|---|---|
| 101 | Alice | 2023-01-15 | 2023-05-20 |
| 102 | Bob | 2023-02-10 | 2023-06-11 |
| 101 | Alice | 2023-01-15 | 2023-07-01 |
| 103 | Charlie | 2023-03-05 | 2023-03-05 |
| 102 | Bob | 2023-02-10 | 2023-08-15 |
这里,第0行和第2行代表同一个客户(ID 101),第1行和第4行代表另一个客户(ID 102)。如果我们对独立客户感兴趣,customer_id列就是我们的标识符。
我们可以使用pandas中的duplicated()方法,但这次我们指定subset参数:
import pandas as pd
data = {'customer_id': [101, 102, 101, 103, 102],
'name': ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob'],
'signup_date': ['2023-01-15', '2023-02-10', '2023-01-15', '2023-03-05', '2023-02-10'],
'last_purchase': ['2023-05-20', '2023-06-11', '2023-07-01', '2023-03-05', '2023-08-15']}
df = pd.DataFrame(data)
# 根据'customer_id'检查重复项
# Keep='first'表示将后续出现的项标记为重复
duplicates_mask = df.duplicated(subset=['customer_id'], keep='first')
print(duplicates_mask)
此代码将输出一个布尔值Series:
0 False
1 False
2 True
3 False
4 True
dtype: bool
这里,False表示customer_id是首次出现(或在之前的行中是唯一的),而True表示此customer_id已在较早的行中出现过。第2行被标记为True,因为customer_id 101在第0行出现过。第4行被标记为True,因为customer_id 102在第1行出现过。
您可以使用此布尔掩码来筛选您的DataFrame,并查看基于特定列的重复条目:
# 显示根据'customer_id'标记为重复的行
print(df[duplicates_mask])
这会显示:
| customer_id | name | signup_date | last_purchase |
|---|---|---|---|
| 101 | Alice | 2023-01-15 | 2023-07-01 |
| 102 | Bob | 2023-02-10 | 2023-08-15 |
如果唯一性由组合定义,您也可以在subset列表中指定多个列:
# 示例:根据'name'和'signup_date'同时检查重复项
duplicates_combo_mask = df.duplicated(subset=['name', 'signup_date'], keep='first')
print(duplicates_combo_mask)
# 在我们的示例数据中,结果与仅检查'customer_id'相同
# 因为姓名/注册日期组合对于每个客户也是唯一的。
# 0 False
# 1 False
# 2 True
# 3 False
# 4 True
# dtype: bool
根据特定列识别重复项,与查看完整行重复或原始行数相比,通常会呈现出数据的不同面貌。一个简单的可视化可以突显这一点。例如,我们可以计算总行数与根据我们选择的列得到的独立条目数量。
对比展示了样本数据中记录总数与发现的独立客户ID数量。
这清楚地表明,虽然我们总共有5条记录,但根据customer_id列,只有3个独立客户。
根据特定列识别重复项是数据清洗中常见且重要的任务。它让您能够正确计算独立实体,避免重复处理,并确保您的分析反映数据的真实内在结构。下一步,将在下一节中说明,是如何处理这些已识别的重复项,这通常涉及有策略地删除它们。
这部分内容有帮助吗?
duplicated() 方法的官方文档,展示其如何使用 subset 参数查找部分重复项。© 2026 ApX Machine Learning用心打造