python pandas dataframe drop_duplicates 去重

本文详细介绍了Pandas库中drop_duplicates()函数如何高效去重,包括参数说明、使用示例以及在实际数据处理中的应用场景。重点讲解了subset、keep和inplace参数的选择与作用。

drop_duplicates()去重

去重在应用当中经常碰到,特别是数据库操作时,因为脏写造成重复数据,重复数据,在进行数据统计时,会严重影响数据的准确性,因此怎么去重? pandas提供了优雅的去复方法,drop_duplicates()

data.drop_duplicates(subset=[列名],keep='first/last/false',inplace=True/False)

  • subset 指定检测重复数据的列名,默认为所有列
  • keep 指定去重去保留的数据项,first 去掉除第一个外的所有重复项  last 去掉除最后一个外的重复项 , False 不保留重复项,默认为first
  • inplace True在原有的DataFrame上操作,类似于传址修改,False复制一个副本去重,默认False

下面咱们通过代码,对该方法进行解释

以下代码截图来自Jupyter中文集成版(Python整合版)

https://github.com/DaiMaBang/Jupyterhttps://github.com/DaiMaBang/Jupyter

 不传递任何参数,直接根据默认值去重


 指定按'sex'列进行云重,这样,sex为男和女的,各自保留一行

<think>我们面对的问题:如何在含有嵌套字段的DataFrame中使用drop_duplicates? 根据之前的讨论,嵌套字段(如JSON字符串、字典等)不能直接被pandas的内置函数处理。因此,我们需要先将嵌套字段展开,然后,或者自定义规则。 步骤: 1. 解析嵌套字段:将嵌套字段(如JSON字符串)解析为多个新列。 2. 使用drop_duplicates:基于这些新列(或结合其他列)进行。 3. 恢复数据结构(可选):如果希望保持原始嵌套结构,后可以将展开的列新合并为嵌套字段。 注意:drop_duplicates默认基于所有列进行,但我们可以通过subset参数指定要依据的列(包括展开后的列)。 示例: 假设我们有如下DataFrame,其中details列是包含嵌套信息的JSON字符串:</think># Pandas DataFrame 中处理嵌套字段的操作 在 Pandas 中处理包含嵌套字段(如 JSON 或字典结构)的 DataFrame 操作,需要先解析嵌套字段,然后进行。以下是完整解决方案: ## 完整解决方案 ### 1. 解析嵌套字段并 ```python import pandas as pd import json # 创建示例数据(含嵌套字段) data = { 'id': [1, 2, 3, 4, 5], 'details': [ '{"name": "Alice", "age": 25, "scores": {"math": 90, "english": 85}}', '{"name": "Bob", "age": 30, "scores": {"math": 78, "english": 92}}', '{"name": "Alice", "age": 25, "scores": {"math": 90, "english": 85}}', # 复项 '{"name": "Charlie", "age": 28, "scores": {"math": 88, "english": 90}}', '{"name": "Bob", "age": 30, "scores": {"math": 78, "english": 92}}' # 复项 ] } df = pd.DataFrame(data) # 步骤1:解析嵌套字段为多个新列 df_expanded = pd.concat([ df.drop('details', axis=1), df['details'].apply(json.loads).apply(pd.Series), df['details'].apply(lambda x: pd.Series(json.loads(x)['scores'])) ], axis=1) # 步骤2:基于嵌套字段 df_deduplicated = df_expanded.drop_duplicates( subset=['name', 'age', 'math', 'english'], # 包含嵌套字段的展开列 keep='first' # 保留第一次出现的复项 ) print("后的DataFrame:") print(df_deduplicated) ``` ### 2. 直接基于嵌套字段(不展开) ```python # 方法2:直接处理嵌套字段的 def extract_key(detail_str): """从嵌套字段提取关键特征作为依据""" detail = json.loads(detail_str) return ( detail['name'], detail['age'], detail['scores']['math'], detail['scores']['english'] ) # 创建临时列作为依据 df['composite_key'] = df['details'].apply(extract_key) # 基于复合键 df_deduplicated = df.drop_duplicates(subset=['composite_key'], keep='first') # 移除临时列 df_deduplicated = df_deduplicated.drop('composite_key', axis=1) print("\n直接基于嵌套字段的结果:") print(df_deduplicated) ``` ## 关键参数说明 `drop_duplicates()` 方法的关键参数: - `subset`:指定用于识别复项的列(可包含嵌套字段展开后的列) - `keep`:控制保留哪个复项 - `'first'`:保留第一次出现的复项(默认) - `'last'`:保留最后一次出现的复项 - `False`:删除所有复项 - `inplace`:是否原地修改DataFrame(默认为`False`) ## 嵌套字段的最佳实践 1. **性能优化**: ```python # 只解析需要的字段,减少内存消耗 df['name'] = df['details'].apply(lambda x: json.loads(x)['name']) df_deduplicated = df.drop_duplicates(subset=['name'], inplace=False) ``` 2. **处理多层嵌套**: ```python # 提取多层嵌套字段作为依据 df['math_score'] = df['details'].apply(lambda x: json.loads(x)['scores']['math']) df_deduplicated = df.drop_duplicates(subset=['math_score'], keep='first') ``` 3. **自定义规则**: ```python # 基于嵌套字段的复杂规则 def custom_deduplication(row): detail = json.loads(row['details']) return detail['age'] > 25 and detail['scores']['math'] > 80 # 先过滤再 df_filtered = df[df.apply(custom_deduplication, axis=1)] df_deduplicated = df_filtered.drop_duplicates(subset=['id']) ``` ## 输出示例 ``` 后的DataFrame: id name age math english 0 1 Alice 25 90 85 1 2 Bob 30 78 92 3 4 ... 28 88 90 ``` ## 注意事项 1. **内存管理**:展开大型嵌套数据集可能消耗大量内存,建议分批处理[^3] 2. **缺失值处理**:嵌套字段可能包含缺失值,使用`df.dropna(subset=[...])`先清理[^1] 3. **数据类型**:确保数值字段正确转换为数字类型(如`astype(int)`) 4. **性能平衡**:直接解析嵌套字段比完全展开内存效率更高,但代码更复杂 > 所有操作默认返回新DataFrame,如需修改原数据需设置`inplace=True`[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值