我想使用pandas groupby将大型的csv文件转换为hdf5文件

时间:2019-07-24 06:54:13

标签: python pandas-groupby hdf5

我的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

1 个答案:

答案 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文件,则可以在熊猫中读取文件后对其进行过滤。这可能会更快。取决于您执行操作的频率以及是否必须阅读所有内容。