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

Convert Python Dask Series to list or Dask DataFrame inside for loop

我正在使用 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 returns 一个 Dask 系列 N。目前,我必须 .compute() Dask 系列才能将其转换为列表。我无法克服这个问题。

  1. 是否可以将 N(这是一个 Dask 系列)作为一行垂直附加到空白的 Dask DF 中?例如。在 Pandas,我倾向于做 this: df_N = pd.DataFrame() 会超出 for 循环并且 然后是 df_N = pd.concat([df_N,N],axis=0) 之类的东西。这个会 允许在 for 循环中构建 Dask DF。在那之后 (在循环外),我可以很容易地水平连接 将 Dask DF 构建到 pd.DataFrame(list_1).
  2. 另一种方法是从 Dask 创建单行 Dask DF 系列 N。然后,将这个单行 DF 垂直连接到 空白 Dask DF(在循环外创建)。是否有可能在 Dask 中创建单行 Dask DataFrame 来自系列?

附加信息(如果需要):

Is it possible to vertically append N (which is a Dask Series) as a row to a blank Dask DF? eg. in Pandas, I tend to do this: df_N = pd.DataFrame() would go outside the for loop and then something like df_N = pd.concat([df_N,N],axis=0). This would allow a Dask DF to be built up in the for loop. After that (outside the loop), I could easily just horizontally concatenate the built-up Dask DF to pd.DataFrame(list_1).

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

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

注意:我实际上并没有费心去理解你的代码。我只是在最后回答问题。希望其他人能给出更全面的答案。