2017-05-03 72 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。建議只在可能的情況下設置完整個計算後才調用計算。否則,你可能沒有獲得太多平行度。

注:我沒有真正瞭解您的代碼的麻煩。我只是在最後回答問題。希望有人會有更全面的答案。