繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM