从dask中生成列表 - 获取值错误

时间:2017-12-24 15:14:24

标签: dask

我们有dask DataFrame如下:

ID  listNum
1  [a,b]
2  [a,b,c]
3  [d,e,f,g]   

需要转换为

ID  listNum
1  [a,b]
2  [a,b]
2  [b,c]
2  [a,c]
3  [d,e]  
3  [d,f]  
3  [d,g]  
3  [e,f]     
3  [e,g]     
3  [f,g]     

Pandas中,以下代码可以使用

list_combine=[x, list(i) for x,y in df[['ID', 'listNum']].values 
                         for i in list(itertools.combinations(y,2))]
df_combinations = pd.DataFrame(data=[(idx, num[0], num[1]) for idx, num in list_combine]
                                  , columns=['idx', 'num1', 'num2'])

dask.DataFrame上运行list_combine行时,我们收到以下错误:

list_combine=[x, y for x,y in df[['ID', 'listNum']].values]
`ValueError: ('Arrays chunk sizes are unknown: %s', (nan,2) )`

我想有必要将dask.dataframe转换为dask.array,然后重新创建dask.dataframe

目前我们的解决方案是将其转换为列表,然后使用Pandas.Dataframe

list_combine=[x, list(i) for x,y in df[['ID', 'listNum']].compute().values 
                             for i in list(itertools.combinations(y,2))]

有没有更好的方法来生成最终所需的数据帧?

1 个答案:

答案 0 :(得分:0)

我会使用map_partitions

将您的Pandas功能应用到您的dask数据框中
def your_function(df):
    list_combine=[x, list(i) for x,y in df[['ID', 'listNum']].values 
                             for i in list(itertools.combinations(y,2))]
    df_combinations = bpd.DataFrame(data=[(idx, num[0], num[1]) for idx, num in list_combine]
                                      , columns=['idx', 'num1', 'num2'])
    return df_combinations

ddf = ddf.map_partitions(your_function, meta=ddf._meta)

虽然,作为警告,Pandas / Dask对列表dtypes的效率不如标量类型。