2017-06-18 81 views
0

我有一個創建值列表的功能。以下是對給定從數據幀行時這樣的功能可能會做的簡化版本。DASK方法返回應用方法的字典搜索結果

def generate_key_list_pair(row): 
    some_list = do_something_to_make_a_list(row) 
    return some_list 

我想那麼方法適用於所有行的數據幀DASK並返回一個字典這樣的:

ddf.apply(generate_key_list_pair) 

...會返回一個詞典,其關鍵字是行ID和其值分別爲從各行的結果應用函數,例如:

{ 
    1: [3.0, 4.12, 5.2, 23.1, 4.9], 
    ... 
    n: [9.34, 8.12, 3.42, 12.1, 34.2] 
} 

1通過n將是從行系列對象列的值傳遞到每個generate_key_list_pair函數調用。

編輯:1 ... N可以是唯一的標識符在原來的數據幀一列中存在。

+1

要清楚,1..n是每個分區內的行索引值(所以它們對每個分區重複)? – mdurant

+1

謝謝你的提問。 1 ... n可能是數據框中列中存在的唯一標識符。我可以編輯原始問題來澄清。 – kuanb

回答

1

DASK非數據幀的方法,如apply一般會給你回更多dataframes,這也不是我們所追求的在這種情況下。但是,您可以訪問組成大熊貓dataframes,仍然保持調度/並行操作:

def dict_from_part(df): 
    d2 = df.set_index('id_column').apply(do_something_to_make_a_list, axis=1) 
    # d2 is a series, so long as the number of elements of the lists 
    # isn't accidentally the same as the number of columns 
    return d2.to_dict() 

parts = [delayed(dict_from_part)(df) for df in ddf.to_delayed()] 

現在partsdelayed對象,像你想每一個都可以compute -d以字典的列表。如果你想這些字典結合起來,則需要改爲建立的元組(例如,項目()),總結這些。

+0

謝謝。如果我正確地理解了代碼,當部件被調用時,它會返回一個列表,其中的每個元素表示其中一個分區?那是對的嗎? – kuanb

+1

是的,每個元素都是從原始數據幀的其中一個分區生成的字典句柄。直到你調用compute(這是每個元素的一個方法,或者你可以在整個列表中使用'dask.compute'),計算纔會真正發生。 – mdurant