我的csv文件非常大,我想以快速的方式将其转换为hdf5文件。
我的数据看起来像这样,但是有数百万个数据点。
我想按“日期”和“名称”将其分组。也就是说,我想要这个层次结构“ /日期/名称”。
Date Name No Price Quantity
date1 f1 1 1 11
date1 f1 2 2 12
date1 f1 3 3 13
date2 f1 1 4 14
date2 f1 2 5 15
date2 f1 3 6 16
date3 f1 1 7 17
date3 f1 2 8 18
date3 f1 3 9 19
date1 f2 1 10 20
date1 f2 2 11 21
date1 f2 3 12 22
date2 f2 1 13 23
date2 f2 2 14 24
date2 f2 3 15 25
date3 f2 1 16 26
date3 f2 2 17 27
date3 f2 3 18 28
date1 f3 1 19 29
date1 f3 2 20 30
date1 f3 3 21 31
date2 f3 1 22 32
date2 f3 2 23 33
date2 f3 3 24 34
date3 f3 1 25 35
date3 f3 2 26 36
date3 f3 3 27 37
我尝试了以下方法。
我将csv文件逐行转换为hdf文件。它虽然有效,但要花费大量时间。我想要一个更快的方法。
我尝试了groupby函数。它似乎有效,但产生了意外的结果。
我的代码:
import dask.dataframe as dd
import pandas as pd
my_csv = dd.read_csv('E:/Hdf5_test.csv',blocksize=100) #I set blocksize to 100 in order to make multiple partitions.
def make_hdf(df):
g_name = 'Date'+ str(df.iloc[0,0]) + 'Firm' + str(df.iloc[0,0]) #This is the key
store.append(g_name, df, data_columns=True, compression='gzip', compression_opts=9)
hdf_file = 'E:/output.hdf5'
store = pd.HDFStore(hdf_file, mode='a')
order.groupby(['Date','Name']).apply(make_hdf, meta = dict(my_csv.dtypes)).compute()
store.close()
I want a hdf5 file like this:
key = '/date1/f1/'
Date Name No Price Quantity
date1 f1 1 1 11
date1 f1 2 2 12
date1 f1 3 3 13
key = '/date2/f1/'
Date Name No Price Quantity
date2 f1 1 4 14
date2 f1 2 5 15
date2 f1 3 6 16
key = '/date3/f1/'
Date Name No Price Quantity
date3 f1 1 7 17
date3 f1 2 8 18
date3 f1 3 9 19
key = '/date1/f2/'
Date Name No Price Quantity
date1 f2 1 10 20
date1 f2 2 11 21
date1 f2 3 12 22
key = '/date2/f2/'
Date Name No Price Quantity
date2 f2 1 13 23
date2 f2 2 14 24
date2 f2 3 15 25
key = '/date3/f2/'
Date Name No Price Quantity
date3 f2 1 16 26
date3 f2 2 17 27
date3 f2 3 18 28
key = '/date1/f3/'
Date Name No Price Quantity
date1 f3 1 19 29
date1 f3 2 20 30
date1 f3 3 21 31
key = '/date2/f3/'
Date Name No Price Quantity
date2 f3 1 22 32
date2 f3 2 23 33
date2 f3 3 24 34
key = '/date3/f3/'
Date Name No Price Quantity
date3 f3 1 25 35
date3 f3 2 26 36
date3 f3 3 27 37
答案 0 :(得分:0)
如果您真的想拆分记录,可以尝试以下代码:
for (group_date, group_name), group in df.groupby(['Date', 'Name']):
g_name= f'/{group_date}/{group_name}/'
print(hdf_key, group.shape)
store.append(g_name, group, data_columns=True, compression='gzip', compression_opts=9)
但是,如果您要处理的组很多,它可能仍会花费很多时间。如果稍后从熊猫读取hdf5文件,则可以在熊猫中读取文件后对其进行过滤。这可能会更快。取决于您执行操作的频率以及是否必须阅读所有内容。