从系列

时间:2015-11-04 13:05:20

标签: python pandas

我需要运行一个函数,为每行返回两个不同的值,我用

完成
result = df.apply(
    lambda row: pandas.Series(
        (do_something(row), do_something_else(row)),
        index=('result', 'meta')),
    axis=1)`

但是,在具有2.8mil行的数据集上运行此操作会很快遇到内存问题(并且它也比仅返回一列慢得多)。我想知道是否可以这样做

result = df.apply(
    lambda row: (do_something(row), do_something_else(row)),
    axis=1)

(每行中包含两个元素元组的系列),如果可能的话,可以只访问每一行的第一个(或第二个)元素而不通过series.apply()

1 个答案:

答案 0 :(得分:0)

最后,我以不同方式解决了问题

完成后

result = df.apply(
    lambda row: (do_something(row), do_something_else(row)),
    axis=1)

而不是试图将它们分成两个单独的系列,我做了这个

new_result = pandas.DataFrame(
    result.values.tolist(),
    index=df.index,
    columns=('column1', 'column2'))

我实际上将原始的df分解为多块处理(使用concurrent.futures),因此示例实际调用应该如下所示

with concurrent.futures.ProcessPoolExecutor(max_workers=4) as pool:
    jobs = []

    for i in range(njobs * 10):
        bounds = (ceil(i * data.shape[0] / float(njobs * 10)),
                  ceil((i + 1) * data.shape[0] / float(njobs * 10)))

        jobs.append(pool.submit(
            df[bounds[0]:bounds[1]].apply,
            some_func_returning_tuple_of_two,
            axis=1))

    result = pandas.DataFrame(
        list(itertools.chain.from_iterable([job.result() for job in jobs])),
        index=data.index,
        columns=('result', 'meta') if has_meta else ('result'))