我有一个较大的DataFrame,请问,如何快速取date维度的唯一值?
我现在用的是如下的方法,先取出后去重,速度有点慢,耗时5s:
df = store.df.date.drop_duplicates()
之前我把数据存储在mysql中,用sql取唯一的date值只需要80ms:
select distinct date from table
请问,我该如何优化?
是不是我在保存的时候有问题?date维度应该只存11527个值?code维度应该只存5000个值?
import pandas as pd
import numpy as np
from itertools import product
from time import time
#生成数据
def generate_data():
np.random.seed(202108)
date = pd.date_range(start="19900101", end="20210723", freq="D")
date = pd.DataFrame(date, columns=["date"])
code = pd.DataFrame(range(5000), columns=["code"])
# generate product of the two columns:
df = pd.DataFrame(product(date["date"], code["code"]), columns=["date", "code"])
df['data'] = np.random.random(len(df))
return df
#保存数据
def save_data(filename, df):
store = pd.HDFStore(filename)
store['df'] = df
store.close()
return
#读数据
def read_unique_date(file_name):
store = pd.HDFStore(file_name)
start = time()
df = store.df.date.drop_duplicates()
store.close()
stop = time()
print(stop - start)
return df
def main():
path = 'd:\\'
file = 'large data.h5'
file_name = path + file
df = generate_data()
save_data(file_name, df)
df1 = read_unique_date(file_name)
return
if __name__ == '__main__':
main()
建议是别用drop_duplicates。
因为你存的是data与code的笛卡尔积,即11527*5000条数据,5000万条左右。
存储的文件体积应该2.8G左右吧,并且没有索引
数据量还是不小的,mysql的去重是借助索引进行优化的,pandas的性能没那么高。
所以建议使用高性能的去重方法(比如bitmap之类的,或者借助redis自己写一个等等)