从序列中获取特定列表元素

2024-04-20 01:53:09 发布

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

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

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()就访问每行的第一个(或第二个)元素


Tags: lambda函数元素pandasdfindexresultdo
1条回答
网友
1楼 · 发布于 2024-04-20 01:53:09

最后我以不同的方式解决了这个问题

做完之后

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'))

相关问题 更多 >