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

1.问题

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

import pandas as pd

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')
print(data)
            open  close
date                   
2020-01-04   102    102
2020-01-04   102    102
2020-01-05   102    102
2020-01-06   105    105

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

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

a = data
print(a.drop_duplicates())
            open  close
date                   
2020-01-04   102    102
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()])
            open  close
date                   
2020-01-04   102    102
2020-01-05   102    102
2020-01-06   105    105

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

3.完整代码

import pandas as pd

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')
print(data)

a = data
print('去重--只匹配列,不匹配索引')
print(a.drop_duplicates())

print('去重--只匹配索引,不匹配列')
print(data[~data.index.duplicated()])
E:\Python\Python38-32\python.exe E:/python_project/test.py
            open  close
date                   
2020-01-04   102    102
2020-01-04   102    102
2020-01-05   102    102
2020-01-06   105    105
去重--只匹配列,不匹配索引
            open  close
date                   
2020-01-04   102    102
2020-01-06   105    105
去重--只匹配索引
            open  close
date                   
2020-01-04   102    102
2020-01-05   102    102
2020-01-06   105    105

Process finished with exit code 0


 

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

狮子王量化

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值