【问题标题】:I want to convert a large csv file into hdf5 file using pandas groupby我想使用 pandas groupby 将大型 csv 文件转换为 hdf5 文件
【发布时间】:2019-12-02 06:03:59
【问题描述】:

我有一个非常大的 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

【问题讨论】:

  • 欢迎来到 Stackoverflow。我做对了吗,您想将数据的每个部分存储在它自己的键下,例如 key='/date3/f2/'?如果是这样,您为什么需要它,因为我想这将需要遍历组并且需要大量时间。如果您稍后将数据与 pandas 一起使用,那么您可以过滤数据帧,这很可能会快得多。

标签: python pandas-groupby hdf5


【解决方案1】:

如果你真的喜欢拆分记录,可以试试下面的代码:

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 后过滤该文件。这可能会更快。取决于您阅读的频率以及是否必须阅读所有内容。

【讨论】:

  • 感谢您的回复。我之所以要这样做是为了修改文件。我有另一个文件,我需要从中提取一些信息并将其添加到第一个文件中。我应该按日期和公司名称匹配它们。我认为按日期和公司分组会更快。过滤比我尝试做的更快吗?
猜你喜欢
  • 2016-12-13
  • 2018-05-23
  • 2014-06-13
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 2018-04-29
相关资源
最近更新 更多