Python-Dask映射分区

Python-Dask映射分区,python,pandas,dask,Python,Pandas,Dask,可能是这一点的延续,从dask docs示例中学习map_分区 import dask.dataframe as dd df = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'y': [1., 2., 3., 4., 5.]}) ddf = dd.from_pandas(df, npartitions=2) from random import randint def myadd(df): new_value = df.x + randint(1,

可能是这一点的延续,从dask docs示例中学习map_分区

import dask.dataframe as dd
df = pd.DataFrame({'x': [1, 2, 3, 4, 5],     'y': [1., 2., 3., 4., 5.]})
ddf = dd.from_pandas(df, npartitions=2)

from random import randint

def myadd(df):
    new_value = df.x + randint(1,4)
    return new_value

res = ddf.map_partitions(lambda df: df.assign(z=myadd)).compute()
res
在上面的代码中,randint只被调用一次,而不是像我预期的那样每行调用一次。为什么

输出:

X Y Z

1 1 4

2 2 5

3 3 6

4 4 7


5 5 8

如果在原始熊猫数据帧上执行相同的操作(
df.x+randint(1,4)
),则只会得到一个随机数,添加到列的每个先前值中。这与pandas的情况完全相同,只是每个分区调用一次,这就是
map\u分区
的作用

如果你想为每一行添加一个新的随机数,你应该首先考虑如何使用熊猫来实现这一点。我可以马上想到两个:

df.x.map(lambda x: x + random.randint(1, 4))


如果将
newvalue=
行替换为其中一行,它将按预期工作。

如果在原始数据帧上执行相同的操作(
df.x+randint(1,4)
),则只会得到一个随机数,添加到列的每个先前值中。这与pandas的情况完全相同,只是每个分区调用一次,这就是
map\u分区
的作用

如果你想为每一行添加一个新的随机数,你应该首先考虑如何使用熊猫来实现这一点。我可以马上想到两个:

df.x.map(lambda x: x + random.randint(1, 4))

如果将
newvalue=
行替换为其中一行,它将按预期工作