pandas数据去重:drop_duplicates与duplicated函数

本文详细介绍了Pandas库中用于数据去重的两个关键函数:duplicated()和drop_duplicates()。duplicated()函数返回布尔型Series,标记数据框中重复的行;drop_duplicates()函数则根据指定条件删除重复行。参数subset用于选择特定列进行去重,keep参数决定了保留第一次出现('first')还是最后一次出现('last')的记录,或者删除所有重复('false')的记录。inplace参数决定是否直接在原始数据框上进行操作。通过实例展示了如何使用这两个函数进行数据清洗。

1 drop_duplicates与duplicated参数:

  • DataFrame.duplicated(subset=None,keep=‘first’)
  • DataFrame.drop_duplicates(subset=None, keep=‘first’, inplace=False)
    • subset:列标签,可选, 默认使用所有列,只考虑某些列来识别重复项传入列标签或者列标签的序列
    • keep:{‘first’,‘last’,False},默认’first’
      • first:删除第一次出现的重复项。

      • last:删除重复项,除了最后一次出现。

      • “false”:删除所有重复项

    • inplace:是否替换原数据,默认是生成新的对象,可以复制到新的DataFrame,如果设置为True则乎替换原有数据,通常不建议设置为True
    • inplace参数的定义在pandas中有点类似,上述说法也可以对比rename函数中的inplace参数的作用

https://zhuanlan.zhihu.com/p/470913844

2 duplicated函数

  • subset=None默认情况下去重
import pandas as pd 
df = pd.DataFrame({
    'brand': ['Yum Yum', 'Yum Yum', 'Indomie', 'Indomie', 'Indomie'],
    'style': ['cup', 'cup', 'cup', 'pack', 'pack'],
    'rating': [4, 4, 3.5, 15, 5]
})
df
df.duplicated()

在这里插入图片描述

  • 显然是全部列都标识作为去重条件
  • subset=[‘brand’,‘style’] 时候
    在这里插入图片描述
  • 可以看到用duplicated函数返回的都是布尔类型的结果,为方便展示,接下来的参数功能使用drop_duplicates函数结果
  • keep(默认为保留第一个“first”)
    在这里插入图片描述
  • keep(保留最后一个“last”)在这里插入图片描述
  • keep(删除所有重复值“false”)
    在这里插入图片描述
  • inplace=True 对原DF进行修改,不返回新的对象
    在这里插入图片描述
  • inplace=False 不对原DF进行修改,返回新的对象
    在这里插入图片描述

参考资料

  • https://zhuanlan.zhihu.com/p/58976044
  • https://blog.youkuaiyun.com/weixin_42097208/article/details/112403720
<think>好的,我现在需要解决用户提出的关于pandasdrop_duplicates函数无法正确的问题。首先,我得回忆一下自己对这个函数的了解,以及常见的问题原因。用户提到函数无法正确,可能涉及到几个方面,比如数据中的隐藏字符、索引问题、数据类型不一致,或者参数设置不正确等。 根据用户提供的引用内容,引用[1]提到索引问题可能导致drop_duplicates失效,比如索引相同可能让Pandas不认为行是复的。解决方法包括置索引。引用[2]和[3]则说明了drop_duplicates的基本用法和参数,如subset、keep、inplace等。这些参数如果设置不当,也会导致结果不符合预期。 接下来,我需要整理可能的原因和对应的解决方案。首先,索引问题确实是一个常见因素,尤其是在数据经过多次操作后,索引可能复或者混乱。这时,使用reset_index()可能会有帮助。 然后是数据类型的问题。例如,同一列可能有不同的数据类型,如字符串和数值混合,或者存在NaN值,这些都会影响的判断。用户需要检查各列的数据类型是否一致,使用dtypes方法查看,并进行转换处理。 另外,隐藏字符或空格也是一个容易被忽视的问题。比如字符串前后有空格或不可见字符,导致看起来相同的值实际上被当作不同的处理。这时,使用strip()方法清理数据可能会有帮助。 参数设置是否正确也很要。比如subset参数是否指定了正确的列,keep参数是否选择了保留第一个还是最后一个,或者是否保留所有复项。如果用户没有正确设置subset,可能会漏掉某些需要的列,或者错误地包含不需要的列。 还有一个可能是浮点数的精度问题。例如,浮点数的小数部分由于精度问题导致看似相同的数值实际上有微小差异。这种情况下,可以考虑四舍五入或者转换为整数后再。 此外,检查是否有复行实际存在。用户可能误以为数据中有复,但实际数据存在细微差别,这时候需要先用duplicated()方法确认复情况。 在解决方案中,我需要分步骤说明每个可能的原因和对应的处理方法,并提供代码示例,这样用户可以直接应用。例如,处理隐藏字符时,可以展示如何使用applymap和strip来清理数据;处理数据类型问题时,演示如何转换类型;参数设置方面,举例说明subset和keep的使用方法。 最后,还需要提醒用户注意inplace参数的使用,避免因为未正确保存结果而误以为函数失效。同时,建议用户在处理后使用shape或duplicated().sum()来验证效果。 总结下来,我需要将可能的原因逐一列出,并给出具体的解决步骤和代码示例,确保用户能够逐步排查和解决问题。同时,参考提供的引用内容,确保涵盖索引、数据类型、参数设置等方面的问题,并结合实际案例进行说明,使回答清晰易懂,切实帮助用户解决drop_duplicates无法正确的问题。</think>### drop_duplicates无法正确的原因及解决方案 #### 一、常见原因分析 1. **隐藏字符或空格干扰** 字符串列可能包含不可见字符(如换行符`\n`、制表符`\t`)或首尾空格,导致看似相同的值被误判为不同。例如: - 原始数据:`"apple "`(末尾空格) vs `"apple"` - 解决方法:使用`.str.strip()`清理字符串列[^3]。 2. **数据类型不一致** 同一列中存在混合数据类型(如字符串数值共存),或`NaN`值的处理差异。例如: ```python df = pd.DataFrame({'A': [1, '1', np.nan, np.nan]}) ``` - `1`(整型)`'1'`(字符串)会被视为不同值 - `np.nan`默认自身不相等(需特殊处理)[^2]。 3. **索引干扰** 若数据帧存在复索引,可能影响逻辑的判断。例如: ```python df.index = [0, 0, 1, 1] # 索引复 ``` 4. **参数设置不当** - `subset`未指定关键列,导致未按实际业务逻辑 - `keep`参数误设为`'last'`或`False`(删除全部复项) - 忘记`inplace=True`或未新赋值,导致原数据未更新[^1]。 5. **浮点数精度问题** 浮点型数据因精度差异(如`3.0000000001` vs `3.0`)被误判为不同值。 --- #### 二、分步解决方案 ##### 步骤1:清理数据格式 ```python # 处理字符串列中的隐藏字符和空格 df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x) # 处理浮点数精度(保留4位小数) df = df.round(4) ``` ##### 步骤2:统一数据类型 ```python # 查看列数据类型 print(df.dtypes) # 强制转换列类型(示例:转为字符串) df['column'] = df['column'].astype(str) # 处理NaN值(统一替换为None) df = df.where(pd.notnull(df), None) ``` ##### 步骤3:置索引 ```python df = df.reset_index(drop=True) ``` ##### 步骤4:正确配置参数 ```python # 明确指定关键列 + 保留首次出现 + 直接修改原数据 df.drop_duplicates(subset=['col1', 'col2'], keep='first', inplace=True) # 验证数据量变化 print(f": {df.shape[0]}行, : {df.drop_duplicates().shape[0]}行") ``` ##### 步骤5:验证复项 ```python # 查看复行详情 duplicates = df[df.duplicated(subset=['col1'], keep=False)] print(duplicates.sort_values('col1')) ``` --- #### 三、完整案例演示 ```python import pandas as pd import numpy as np # 构造含多种问题的测试数据 data = { 'ID': [1, 1, 2, 2], 'Text': ['apple ', 'apple', 'banana\t', 'banana'], 'Value': [3.1415926, 3.1415, 2.71828, 2.718] } df = pd.DataFrame(data) # 1. 清理数据 df['Text'] = df['Text'].str.strip() df['Value'] = df['Value'].round(4) # 2. 操作 df_clean = df.drop_duplicates(subset=['ID', 'Value'], keep='first') print("结果:") print(df_clean) ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

矮人三等

秀儿,是你吗秀儿?

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

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

打赏作者

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

抵扣说明:

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

余额充值