从系列创建大熊猫数据框

我正在处理相当大规模的数据。 作为参考,给定的样品将具有约75,000,000个行和15,000-20,000个柱。

到目前为止,为了节省内存,我采用了创建系列列表的方法(每列都是一系列,所以〜15K-20K系列每个都包含〜250K行)。 然后,我创建一个SparseDataFrame,其中包含这些系列中的每个索引(因为您注意到,这是一个很大但不是很密集的数据集)。 问题是这变得非常缓慢,并且将每列附加到数据集需要几分钟的时间。 为了克服这个问题,我尝试了批量合并(选择数据的一个子集,将它们合并到一个DataFrame中,然后合并到我的主DataFrame中),但这种方法仍然太慢。 慢意味着它只能在一天内处理大约4000列,每次追加都会导致后续追加花费更长的时间。

一个让我感到奇怪的部分是为什么我的DataFrame的列数会影响追加速度。 因为我的主索引已经包含了它所看到的所有条目,所以我不应该因为重新索引而浪费时间。

无论如何,这里是我的代码:

import time
import sys
import numpy as np
import pandas as pd
precision = 6
df = []
for index, i in enumerate(raw):
    if i is None:
        break
    if index%1000 == 0:
        sys.stderr.write('Processed %s...n' % index)
    df.append(pd.Series(dict([(np.round(mz, precision),int(intensity)) for mz, intensity in i.scans]), dtype='uint16', name=i.rt))

all_indices = set([])
for j in df:
    all_indices |= set(j.index.tolist())

print len(all_indices)
t = time.time()
main_df = pd.DataFrame(index=all_indices)
first = True
del all_indices
while df:
    subset = [df.pop() for i in xrange(10) if df]
    all_indices = set([])
    for j in subset:
        all_indices |= set(j.index.tolist())
    df2 = pd.DataFrame(index=all_indices)
    df2.sort_index(inplace=True, axis=0)
    df2.sort_index(inplace=True, axis=1)
    del all_indices
    ind=0
    while subset:
        t2 = time.time()
        ind+=1
        arr = subset.pop()
        df2[arr.name] = arr
        print ind,time.time()-t,time.time()-t2
    df2.reindex(main_df.index)
    t2 = time.time()
    for i in df2.columns:
        main_df[i] = df2[i]
    if first:
        main_df = main_df.to_sparse()
        first = False
    print 'join time', time.time()-t,time.time()-t2
    print len(df), 'entries remain'

任何关于如何快速加载这个大型数据集的建议都是值得赞赏的,即使这意味着首先将其写入磁盘到其他格式/ etc。

一些额外的信息:

1)由于列的数量,我不能使用大多数传统的磁盘存储,如HDF。

2)数据在使用时将在列和行之间查询。 所以main_df.loc [row:row_end,col:col_end]。 这些都不是可预测的块大小,所以分块并不是真正的选择。 这些查找也需要很快,大约在每秒10秒左右才能实现。

3)我有32G的内存,所以我认为SparseDataFrame是最好的选择,因为它适合内存,并允许根据需要快速查找。 只是创造它现在是一个痛苦。

更新:

我最终使用scipy稀疏矩阵并暂时处理索引。 这导致以〜0.2秒的恒定速率追加,这是可以接受的(相对于每个追加完整数据集,Pandas需要约150秒)。 我很想知道如何让熊猫匹配这个速度。

链接地址: http://www.djcxy.com/p/53541.html

上一篇: Creation of large pandas DataFrames from Series

下一篇: Appending Column to Frame of HDF File in Pandas