在 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 系列才能将其转换为列表。我无法克服这个问题。
- 是否可以将
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)
.
- 另一种方法是从 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。
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.concat
或 dd.concat
函数。
我还注意到您在 for 循环中调用计算。如果可能,建议仅在设置完整个计算后才调用计算。否则你可能不会获得太多的并行性。
注意:我实际上并没有费心去理解你的代码。我只是在最后回答问题。希望其他人能给出更全面的答案。
我正在使用 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 系列才能将其转换为列表。我无法克服这个问题。
- 是否可以将
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)
. - 另一种方法是从 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。
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.concat
或 dd.concat
函数。
我还注意到您在 for 循环中调用计算。如果可能,建议仅在设置完整个计算后才调用计算。否则你可能不会获得太多的并行性。
注意:我实际上并没有费心去理解你的代码。我只是在最后回答问题。希望其他人能给出更全面的答案。