我需要运行一个函数,为每行返回两个不同的值,我用
完成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()
?
答案 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'))