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