如何将大量数据附加到Pandas HDFStore并获得自然唯一索引?

2024-05-26 16:27:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将大量http日志(80GB+)导入Pandas HDFStore进行统计处理。即使在一个导入文件中,我也需要在加载内容时对其进行批处理。到目前为止,我的策略是将解析的行读入数据帧,然后将数据帧存储到HDFStore中。我的目标是使索引键对于数据存储中的单个键是唯一的,但是每个数据帧都会重新启动它自己的索引值。我原以为HDFStore.append()会有某种机制告诉它忽略数据帧索引值,只是继续添加到我的HDFStore键的现有索引值中,但似乎找不到它。当HDFStore增加其现有索引值时,如何导入数据帧并忽略其中包含的索引值?下面的示例代码每10行一批。当然,真正的东西会更大。

if hd_file_name:
        """
        HDF5 output file specified.
        """

        hdf_output = pd.HDFStore(hd_file_name, complib='blosc')
        print hdf_output

        columns = ['source', 'ip', 'unknown', 'user', 'timestamp', 'http_verb', 'path', 'protocol', 'http_result', 
                   'response_size', 'referrer', 'user_agent', 'response_time']

        source_name = str(log_file.name.rsplit('/')[-1])   # HDF5 Tables don't play nice with unicode so explicit str(). :(

        batch = []

        for count, line in enumerate(log_file,1):
            data = parse_line(line, rejected_output = reject_output)

            # Add our source file name to the beginning.
            data.insert(0, source_name )    
            batch.append(data)

            if not (count % 10):
                df = pd.DataFrame( batch, columns = columns )
                hdf_output.append(KEY_NAME, df)
                batch = []

        if (count % 10):
            df = pd.DataFrame( batch, columns = columns )
            hdf_output.append(KEY_NAME, df)

Tags: columns数据namehttpsourcedfoutputif
1条回答
网友
1楼 · 发布于 2024-05-26 16:27:09

你可以这样做。唯一的诀窍是第一次存储表不存在,所以get_storer将升高。

import pandas as pd
import numpy as np
import os

files = ['test1.csv','test2.csv']
for f in files:
    pd.DataFrame(np.random.randn(10,2),columns=list('AB')).to_csv(f)

path = 'test.h5'
if os.path.exists(path):
    os.remove(path)

with pd.get_store(path) as store:
    for f in files:
        df = pd.read_csv(f,index_col=0)
        try:
            nrows = store.get_storer('foo').nrows
        except:
            nrows = 0

        df.index = pd.Series(df.index) + nrows
        store.append('foo',df)


In [10]: pd.read_hdf('test.h5','foo')
Out[10]: 
           A         B
0   0.772017  0.153381
1   0.304131  0.368573
2   0.995465  0.799655
3  -0.326959  0.923280
4  -0.808376  0.449645
5  -1.336166  0.236968
6  -0.593523 -0.359080
7  -0.098482  0.037183
8   0.315627 -1.027162
9  -1.084545 -1.922288
10  0.412407 -0.270916
11  1.835381 -0.737411
12 -0.607571  0.507790
13  0.043509 -0.294086
14 -0.465210  0.880798
15  1.181344  0.354411
16  0.501892 -0.358361
17  0.633256  0.419397
18  0.932354 -0.603932
19 -0.341135  2.453220

实际上,您并不一定需要全局唯一索引(除非您需要全局唯一索引),因为HDFStore(通过PyTables)通过对行进行唯一编号来提供全局唯一索引。您始终可以添加这些选择参数。

In [11]: pd.read_hdf('test.h5','foo',start=12,stop=15)
Out[11]: 
           A         B
12 -0.607571  0.507790
13  0.043509 -0.294086
14 -0.465210  0.880798

相关问题 更多 >

    热门问题