将新列添加到dask数据帧

时间:2017-10-25 03:04:18

标签: python dask

这是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, ...),但我不确定这是否与此特定案例相关。

编辑1

我试过了 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个分区(不是指示例)。

3 个答案:

答案 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()