2017-05-03 289 views
1

我正在使用Pandas中的代码,其中涉及读取大量文件,然后对循环内的每个文件(它遍历文件列表)执行各种操作。将Python Dask系列转换为列表或用于循环的Dask DataFrame

我试图将此转换为基于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系列,然后才能将其转换为列表。我无法克服这个问题。

  1. 是否可以垂直追加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)
  2. 另一种方法是从Dask 系列N创建单行Dask DF。然后,将此单行DF垂直连接到 空白Dask DF(在循环外部创建)。是否有可能在Dask中创建单行Dask DataFrame ?

附加信息(如果需要):

  • 在我真正的代码,我从一个*.csv文件在循环中读取。出于这个原因,当我生成一个样本dastaset时,我将它写入*.csv文件以便在循环内部使用dd.read_csv()
  • df2s['A'] = df['A'] - 由于上面的行省略了列A(在将每列标准化为其总和期间)并产生新的DataFrame,因此需要此行。 df2s['A'] = df['A']将列A添加回新的DataFrame。
+0

如果您能够将问题简化为更小的示例,我怀疑您会更快地收到更好的答案。你可能想阅读https://stackoverflow.com/help/mcve – MRocklin

+0

好吧,那是怎么回事?我已经删除了Pandas相关材料并截断了其余的基于Dask的代码,以将其保持在最低限度。 –

+0

关于如何处理系列'N'的任何想法? –

回答

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数据框。这是非常低效的。相反,最好将许多熊猫/ dask数据帧集中在一起,然后调用pd.concatdd.concat函数。

另外我注意到你在for循环中调用了compute。建议只在可能的情况下设置完整个计算后才调用计算。否则,你可能没有获得太多平行度。

注:我没有真正了解您的代码的麻烦。我只是在最后回答问题。希望有人会有更全面的答案。