数据清洗处理实战:pandas查找与删除重复行(duplicate()与drop_duplicate()方法详解)

在数据识别开发中,多人识别的数据汇总后存在重行,为理清责任需标记并删除重复数据。Pandas提供了高效处理方法,用duplicate()方法标记,drop_duplicate方法去重,还给出了查重和去除重复值的解决案例。
部署运行你感兴趣的模型镜像

一、实战应用背景

最近在进行数据识别方面的开发时,多人识别的数据汇总后,发现有不少是重行的,这时为理清责任,就需要将重复数据进行标记,并删除重复数据。针对这一问题,pandas上有高效的处理方法,就是用duplicate()方法进行标记,用drop_duplicate方法进行去重。

二、duplicate()方法与drop_duplicate方法参数及解释

两个方法的参数见下表

两种方法参数对照表
duplicate()方法drop_duplicate()参数含义
subsetsubset如果不按照全部内容查重,那么需要指定按照哪些列进行查重。需要注意的是,最好找一个唯一值设置,如单号、身份证号等,比如按照姓名进行查重,就会出现重名的情况。本例用单号:subset=['委托序号'],如果用姓名,可以增加其他列进行辅助,解决重名的问题,如可以按照姓名和出生日期两列查重,subset=['name','birthday'],同理还可以再添加列,这样就可以基本保证去重效果了。
keepkeep决定保留重复行中的哪个:first:保留重复值的第一个;last:保留重复值的最后一个;False:删除重复值的所有行
inplace布尔值,默认为False,是否直接在原数据上删除重复项或删除重复项后返回副本。

ignore_index

布尔值,默认False:不改变DataFrame的原有索引标签,否则将修改为0,1,…n-1

三、解决案例

(一)查重

df.duplicated(subset='委托序号',keep='first')

返回 的这些布尔值可以用一个pd.Series来接收,可以和原来的数据框合并,以进行对比。

df_duplicated = df.duplicated(subset='委托序号',keep='first')
df['duplicated'] = df_duplicated 
# 或者用下面的语句,但没有上面语句简洁实用 
# df = pd.concat([df,df_duplicated],axis=1)
df

(二)去除重复值

df.drop_duplicates('委托序号',
                    keep='first',
                    inplace=True,
                    ignore_index=True)

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们使用pandasdrop_duplicates方法,根据指定的ID列(或列的组合)来删除重复,并保留一条记录(可以指定保留第一条或最后一条)。 根据引用[2],drop_duplicates方法可以指定subset参数(用于指定依据哪些列判断重复)和keep参数(用于指定保留哪一个重复,'first'表示保留第一个出现的,'last'表示保留最后一个出现的,默认为'first')。 步骤: 1. 读取数据(假设数据已读入DataFrame,命名为df) 2. 使用drop_duplicates方法,设置subset为包含ID的列名(可以是单个列名的字符串,或多个列名组成的列表),keep设置为'first'或'last'(根据需求) 3. 可以选择是否就地修改(inplace参数)还是返回一个新的DataFrame 注意:根据引用[3],Pandas的某些操作是直接操作原始数据的,但drop_duplicates方法默认返回一个新的DataFrame(除非设置inplace=True)。因此,我们需要根据需求选择使用方式。 代码示例: 假设我们有一个DataFrame,其中有一列叫做'ID',我们想根据这一列删除重复,保留第一次出现的方法1:返回一个新的DataFrame(推荐,避免修改原始数据) clean_df = df.drop_duplicates(subset='ID', keep='first') 方法2:就地修改(直接修改原始DataFrame) df.drop_duplicates(subset='ID', keep='first', inplace=True) 如果要根据多个列来判断重复,例如根据'ID'和'Name'两列,可以这样写: clean_df = df.drop_duplicates(subset=['ID','Name'], keep='first') 另外,根据引用[1],duplicated()方法可以用来检测重复,返回一个布尔序列,标记每一是否是重复(除了被keep保留的那一)。我们可以先用duplicated()来查看重复的情况,然后再进删除。 例如,查看重复(不包含第一次出现的): duplicate_rows = df[df.duplicated(subset='ID', keep='first')] 完整示例代码: 步骤1:导入pandas并读取数据 步骤2:检查重复情况 步骤3:删除重复 步骤4:保存结果(如果需要) 下面是一个完整的示例:</think># 使用 Pandas 删除重复 ID 的整数据并保留一条记录 在 Pandas处理重复 ID 数据并保留唯一记录是数据清洗的常见任务。下面我将详细介绍如何使用 Pandas 的 `drop_duplicates()` 方法高效实现这一操作。 ## 完整解决方案 ```python import pandas as pd # 示例数据 data = { 'ID': [101, 102, 101, 103, 102, 104], 'Name': ['Alice', 'Bob', 'Alice', 'Charlie', 'Bob', 'David'], 'Age': [25, 30, 25, 35, 30, 28], 'Score': [85, 90, 85, 88, 90, 92] } df = pd.DataFrame(data) print("原始数据:") print(df) # 删除重复ID的,保留第一条记录 clean_df = df.drop_duplicates(subset='ID', keep='first') print("\n处理后的数据:") print(clean_df) ``` ## 关键参数详解 ### 1. `subset` 参数 指定用于判断重复的列名或列名列表: ```python # 单列判断重复 clean_df = df.drop_duplicates(subset='ID') # 多列组合判断重复 clean_df = df.drop_duplicates(subset=['ID', 'Name']) ``` ### 2. `keep` 参数 控制保留哪条重复记录: ```python # 保留第一条记录(默认) clean_df = df.drop_duplicates(subset='ID', keep='first') # 保留最后一条记录 clean_df = df.drop_duplicates(subset='ID', keep='last') # 删除所有重复(不保留任何重复记录) clean_df = df.drop_duplicates(subset='ID', keep=False) ``` ### 3. `inplace` 参数 是否直接在原数据上修改: ```python # 创建新DataFrame(推荐) clean_df = df.drop_duplicates(subset='ID') # 直接在原数据上修改(谨慎使用) df.drop_duplicates(subset='ID', inplace=True) ``` ## 完整数据处理流程 ```python import pandas as pd # 1. 读取数据 df = pd.read_excel('data.xlsx', sheet_name='Sheet1') # 2. 检查重复情况 duplicate_count = df.duplicated(subset='ID').sum() print(f"检测到 {duplicate_count} 个重复ID") # 3. 查看重复详情 duplicate_rows = df[df.duplicated(subset='ID', keep=False)] print("重复详情:") print(duplicate_rows.sort_values('ID')) # 4. 删除重复(保留第一条) clean_df = df.drop_duplicates(subset='ID', keep='first') # 5. 保存结果 clean_df.to_excel('cleaned_data.xlsx', index=False) print(f"处理完成!原始记录数: {len(df)} → 处理后记录数: {len(clean_df)}") ``` ## 高级应用技巧 ### 1. 保留特定条件的记录 ```python # 保留每个ID中Score最高的记录 clean_df = df.sort_values('Score', ascending=False).drop_duplicates('ID', keep='first') ``` ### 2. 多条件去重 ```python # 当ID和Name同时重复时才视为重复 clean_df = df.drop_duplicates(subset=['ID', 'Name']) ``` ### 3. 添加重复计数列 ```python # 添加显示重复次数的列 df['重复次数'] = df.groupby('ID')['ID'].transform('count') clean_df = df.drop_duplicates('ID') ``` ### 4. 创建删除记录报告 ```python # 生成被删除记录的详细报告 original_df = df.copy() clean_df = original_df.drop_duplicates('ID', keep='first') deleted_rows = original_df[~original_df.index.isin(clean_df.index)] deleted_rows.to_excel('deleted_records.xlsx', index=False) ``` ## 注意事项 1. **数据备份**:处理前建议备份原始数据,避免误操作导致数据丢失 2. **列名区分大小写**:`subset` 参数中的列名需 DataFrame 中的列名完全匹配(包括大小写) 3. **缺失值处理**:NaN 值会被视为相同值,如有特殊需求需提前处理缺失值 4. **数据类型一致性**:确保作为判断依据的列数据类型一致 5. **性能优化**:对于大型数据集(>100万),使用 `dask` 库进处理 ## 常见问题解决 **问题:如何保留每个ID的最新记录?** ```python # 按时间戳排序后保留最后一条 df['timestamp'] = pd.to_datetime(df['timestamp']) clean_df = df.sort_values('timestamp').drop_duplicates('ID', keep='last') ``` **问题:如何根据多个条件保留特定记录?** ```python # 保留每个ID中年龄最大的记录 clean_df = df.sort_values('Age', ascending=False).drop_duplicates('ID', keep='first') ``` **问题:处理后的数据需要保持原始顺序?** ```python # 添加原始索引列 df['original_index'] = df.index clean_df = df.drop_duplicates('ID').sort_values('original_index').drop(columns='original_index') ``` **问题:如何同时处理多个重复列?** ```python # 处理ID和Email两列重复 clean_df = df.drop_duplicates(subset=['ID', 'Email']) ``` ## 总结 使用 Pandas 的 `drop_duplicates()` 方法处理重复 ID 数据的高效解决方案[^1][^2]。关键步骤包括: 1. 明确判断重复的依据列(`subset` 参数) 2. 选择保留策略(`keep` 参数) 3. 处理前验证数据,处理后检查结果 4. 根据需求保存处理后的数据 通过合理设置参数和结合其他 Pandas 功能,可以灵活应对各种数据去重场景,确保数据质量[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃饭的家伙事儿

您的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值