我们有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))]
有没有更好的方法来生成最终所需的数据帧?
答案 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的效率不如标量类型。