[英]I want to convert a large csv file into hdf5 file using pandas groupby
我有一个非常大的 csv 文件,我想以快速的方式将其转换为 hdf5 文件。
我的数据看起来像这样,但有数百万个数据点。
我想按“日期”和“名称”对其进行分组。 也就是说,我想要这个层次结构'/Date/Name'。
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
如果你真的喜欢拆分记录,你可以试试下面的代码:
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)
但是如果你有很多组要处理,它可能仍然会消耗很多时间。 如果您稍后从 Pandas 读取 hdf5 文件,则可以在 Pandas 中读取该文件后对其进行过滤。 这可能会更快。 取决于您这样做的频率以及您是否必须阅读所有内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.