【发布时间】: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