在 for 循环中将 Python Dask 系列转换为列表或 Dask DataFrame

Posted

技术标签:

【中文标题】在 for 循环中将 Python Dask 系列转换为列表或 Dask DataFrame【英文标题】:Convert Python Dask Series to list or Dask DataFrame inside for loop 【发布时间】:2017-10-01 15:18:45 【问题描述】:

我正在处理 Pandas 中的代码,该代码涉及读取大量文件,然后在循环中对每个文件执行各种操作(循环遍历文件列表)。

我正在尝试将其转换为基于 Dask 的方法而不是基于 Pandas 的方法,并且到目前为止进行了以下尝试 - 我是 Dask 的新手,需要询问这是否是一种合理的方法。

输入数据如下所示:

     A        X1        X2        X3  A_d  S_d
0  1.0  0.475220  0.839753  0.872468    1    1
1  2.0  0.318410  0.940817  0.526758    2    2
2  3.0  0.053959  0.056407  0.169253    3    3
3  4.0  0.900777  0.307995  0.689259    4    4
4  5.0  0.670465  0.939116  0.037865    5    5

代码如下:

import dask.dataframe as dd
import numpy as np; import pandas as pd

def my_func(df,r): # perform representative calculations
    q = df.columns.tolist()

    df2 = df.loc[:,q[1:]] / df.loc[:,q()[1:]].sum()
    df2['A'] = df['A']

    df2 = df2[ ( df2['A'] >= r[0] ) & ( df2['A'] <= r[1] ) ]

    c = q[1:-2]
    A = df2.loc[:,c].sum()

    tx = df2.loc[:,c].min() * df2.loc[:,c].max()

    return A - tx

list_1 = []
for j in range(1,13):
    df = dd.read_csv('Test_file.csv')
    N = my_func(df,[751.7,790.4]) # perform calculations
    out = ['X'+str(j)+'_2', df['A'].min()] + N.compute().tolist()
    list_1.append(out)
df_f = pd.DataFrame(list_1)

my_func 返回 Dask 系列 N。目前,我必须先.compute() Dask 系列,然后才能将其转换为列表。我很难克服这个问题。

    是否可以将N(这是一个 Dask 系列)作为一行垂直附加到空白 Dask DF 中?例如。在熊猫中,我倾向于做 这:df_N = pd.DataFrame() 将超出for 循环和 然后类似df_N = pd.concat([df_N,N],axis=0)。这个会 允许在for 循环中建立 Dask DF。在那之后 (在循环之外),我可以轻松地水平连接 将 Dask DF 构建到 pd.DataFrame(list_1)。 另一种方法是从 Dask 创建单行 Dask DF 系列N。然后,将此单行 DF 垂直连接到 空白 Dask DF(在循环外创建)。是否可以在 Dask 中创建单行 Dask DataFrame 来自一个系列?

其他信息(如果需要):

在我的真实代码中,我从循环内的*.csv 文件中读取。出于这个原因,当我生成一个示例数据集时,我将它写入一个*.csv 文件,以便在循环中使用dd.read_csv()df2s['A'] = df['A'] - 此行是必需的,因为它上面的行省略了 A 列(在将每列归一化为其总和期间)并生成新的 DataFrame。 df2s['A'] = df['A'] 将列 A 添加回新的 DataFrame。

【问题讨论】:

我怀疑如果您能够将问题简化为更小的示例,您将更快地收到更好的答案。您可能想阅读***.com/help/mcve 好的,怎么样?我已经删除了与 Pandas 相关的材料并截断了剩余的基于 Dask 的代码以将其保持在最低限度。 还有关于如何处理系列N的任何想法? 这是一个简单问题的好例子:***.com/questions/43416809/…。 *** 用户可以在大约 20 秒内理解该代码。这是一个很好的数字。 【参考方案1】:

是否可以将 N(这是一个 Dask 系列)作为一行垂直附加到空白的 Dask DF 中?例如。在 Pandas 中,我倾向于这样做:df_N = pd.DataFrame() 会超出 for 循环,然后是 df_N = pd.concat([df_N,N],axis=0)。这将允许在 for 循环中构建 Dask DF。之后(在循环之外),我可以轻松地将构建的 Dask DF 水平连接到 pd.DataFrame(list_1)。

您不应该将行附加到 Pandas 数据帧或 Dask 数据帧。这是非常低效的。相反,最好将许多 pandas/dask 数据帧收集在一起,然后调用 pd.concatdd.concat 函数。

我还注意到,您在 for 循环中调用了 compute。如果可能,建议仅在设置完整个计算后才调用计算。否则,您可能不会获得太多并行性。

注意:我实际上并没有经历过理解您的代码的麻烦。我只是回答最后的问题。希望其他人能提供更全面的答案。

【讨论】:

有没有办法将 Dask 系列数据帧放入dd.concat?一直问dfs必须是list,但是series不适合?

以上是关于在 for 循环中将 Python Dask 系列转换为列表或 Dask DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

在for循环中将Dataframes附加在一起

python系列教程150——for循环

Dask + Pandas:返回一系列条件假人

将 HDF 文件加载到 Python Dask DataFrames 列表中

从python中的for循环返回值

对于Python和Java之间的循环差异