这是Shuffling data in dask的后续问题。
我有一个现有的dask数据框df
,我希望在其中执行以下操作:
df['rand_index'] = np.random.permutation(len(df))
但是,这会产生错误Column assignment doesn't support type ndarray
。我尝试使用df.assign(rand_index = np.random.permutation(len(df))
,这会产生同样的错误。
这是一个最小的(非)工作样本:
import pandas as pd
import dask.dataframe as dd
import numpy as np
df = dd.from_pandas(pd.DataFrame({'A':[1,2,3]*10, 'B':[3,2,1]*10}), npartitions=10)
df['rand_index'] = np.random.permutation(len(df))
上一个问题提到使用df = df.map_partitions(add_random_column_to_pandas_dataframe, ...)
,但我不确定这是否与此特定案例相关。
我试过了
df['rand_index'] = dd.from_array(np.random.permutation(len_df))
,执行没有问题。当我检查df.head()
时,似乎新列创建得很好。但是,当我查看df.tail()
时,rand_index
是一堆NaN
。
事实上,只是为了确认我检查了df.rand_index.max().compute()
,结果证明小于len(df)-1
。所以这可能是df.map_partitions
发挥作用的地方,因为我怀疑这是dask被分区的问题。在我的特定情况下,我有80个分区(不是指示例)。
答案 0 :(得分:4)
您需要将PieGraph
转换为dask理解的类型:
$drivers = DB::table('drivers')
->join('bank','bank.driver_id','=','drivers.driver_id')
->where(function($query) use ($keywords) {
$query->where('drivers.city', 'like', "$keywords[0]%")
->orWhere('drivers.first_name', 'like', "$keywords[1]%")
->orWhere('bank.bank_name', 'like', "$keywords[3]%");
})
->toSql();
echo "<pre>";
print_r($drivers);
die();
这会产生:
np.random.permutation(len(df))
如果您想permutations = dd.from_array(np.random.permutation(len(df)))
df['rand_index'] = permutations
df
计算实际结果,现在由您决定。
答案 1 :(得分:0)
要指定列,您应使用df.assign
答案 2 :(得分:0)
解决了与Edit 1中相同的问题。
我的解决方法是从现有数据框中获取唯一列,并将其输入要追加的数据框中。
import dask.dataframe as dd
import dask.array as da
import numpy as np
import panda as pd
df = dd.from_pandas(pd.DataFrame({'A':[1,2,3]*2, 'B':[3,2,1]*2, 'idx':[0,1,2,3,4,5]}), npartitions=10)
chunks = tuple(df.map_partitions(len).compute())
size = sum(chunks)
permutations = da.from_array(np.random.permutation(len(df)), chunks=chunks)
idx = da.from_array(df['idx'].compute(), chunks=chunks)
ddf = dd.concat([dd.from_dask_array(c) for c in [idx,permutations]], axis = 1)
ddf.columns = ['idx','rand_idx']
df = df.merge(ddf, on='idx')
df = df.set_index('rand_idx')
df.compute().head()