• 【Python】Pandas通过索引的方式去重df[~df.index.duplicated()]


    1.问题

    在处理股票数据的时候,难免遇到去重的问题。对于以下数据,显然2020-01-04的数据重复了。
    股票数据中,通常用date当成索引,一行数据的date应该都是唯一的。

    1. import pandas as pd
    2. data = pd.DataFrame({'date': ['2020-01-04', '2020-01-04', '2020-01-05', '2020-01-06'], 'open': [102, 102,102, 105], 'close': [102, 102,102, 105]}).set_index('date')
    3. print(data)
    1. open close
    2. date
    3. 2020-01-04 102 102
    4. 2020-01-04 102 102
    5. 2020-01-05 102 102
    6. 2020-01-06 105 105

    数据中2020-01-05的open和close与2020-01-04的是一样的,但date又不一样,因此这里不需要对2020-01-05的数据做去重处理的,只需要对2020-01-04的两条数据去重

    如果利用常规的去重方法 df.drop_duplicates(),就会遇到以下问题:

    1. a = data
    2. print(a.drop_duplicates())
    1. open close
    2. date
    3. 2020-01-04 102 102
    4. 2020-01-06 105 105

    返回的结果相当于把2020-01-05也当重复项做去重处理了。也就是使用 df.drop_duplicates() 方法,是针对于列做去重处理。因为2020-01-05的open和close与2020-01-04的是一样,所以前3条数据被当成重复性处理,就保留了重复数据中的第一条。然而这个结果并不是我们想要的。

    正确是做法是对索引去重。

    2.解决方法

    对索引去重,也只需要用一行代码:df[~df.index.duplicated()]

    print(data[~data.index.duplicated()])
    1. open close
    2. date
    3. 2020-01-04 102 102
    4. 2020-01-05 102 102
    5. 2020-01-06 105 105

    这样的结果才是我们想要的。~df.index.duplicated() 方法是只针对索引做去重,而不考虑列数据,与 df.drop_duplicates() 相反。

    3.完整代码

    1. import pandas as pd
    2. data = pd.DataFrame(
    3. {'date': ['2020-01-04', '2020-01-04', '2020-01-05', '2020-01-06'], 'open': [102, 102,102, 105], 'close': [102, 102,102, 105]}).set_index(
    4. 'date')
    5. print(data)
    6. a = data
    7. print('去重--只匹配列,不匹配索引')
    8. print(a.drop_duplicates())
    9. print('去重--只匹配索引,不匹配列')
    10. print(data[~data.index.duplicated()])
    1. E:\Python\Python38-32\python.exe E:/python_project/test.py
    2. open close
    3. date
    4. 2020-01-04 102 102
    5. 2020-01-04 102 102
    6. 2020-01-05 102 102
    7. 2020-01-06 105 105
    8. 去重--只匹配列,不匹配索引
    9. open close
    10. date
    11. 2020-01-04 102 102
    12. 2020-01-06 105 105
    13. 去重--只匹配索引
    14. open close
    15. date
    16. 2020-01-04 102 102
    17. 2020-01-05 102 102
    18. 2020-01-06 105 105
    19. Process finished with exit code 0


     

  • 相关阅读:
    Ubuntu中安装R语言环境并在jupyter kernel里面增加R kernel
    rust学习-Arc
    【Vue】组件化编程
    基于JAVA农产品的物流信息服务平台计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    torch.argmax()使用
    2023年航空航天、机械与机电工程国际会议(CAMME 2023)
    docker系列:dockerfile及其用法解析
    带你深入学习k8s--(四) 控制器(k8s核心)
    HTML学习笔记Day1-HTML基本语法
    Vue3全局Api应用实例
  • 原文地址:https://blog.csdn.net/CSDN_fzs/article/details/128205923