【发布时间】: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。
【问题讨论】:
-
我怀疑如果您能够将问题简化为更小的示例,您将更快地收到更好的答案。您可能想阅读stackoverflow.com/help/mcve
-
好的,怎么样?我已经删除了与 Pandas 相关的材料并截断了剩余的基于 Dask 的代码以将其保持在最低限度。
-
还有关于如何处理系列
N的任何想法? -
这是一个简单问题的好例子:stackoverflow.com/questions/43416809/…。 stackoverflow 用户可以在大约 20 秒内理解该代码。这是一个很好的数字。
标签: python-2.7 list pandas dask