将Python Dask系列转换为for循环

时间:2017-05-03 17:00:11

标签: python-2.7 list pandas dask

我正在使用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系列。我无法克服这个问题。

  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创建单行Dask DF 系列N。然后,将此单行DF垂直连接到a 空白Dask DF(在循环外创建)。在Dask中是否可以创建单行Dask DataFrame 来自一个系列?
  3. 其他信息(如果需要):

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

1 个答案:

答案 0 :(得分: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。建议仅在设置完整个计算后调用compute。否则你可能没有太多的并行性。

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