Python Dask map_partitions

时间:2018-07-30 21:02:34

标签: python pandas dask

可能是此question的延续,是从map_partitions的dask docs示例工作而来的。

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

1 个答案:

答案 0 :(得分:1)

如果您对原始的熊猫数据框执行了相同的操作(df.x + randint(1,4)),则只会获得一个随机数,该随机数被添加到该列的每个先前值中。这与pandas情况完全相同,只是每个分区都被调用一次-这就是map_partition的工作。

如果您想为每行设置一个新的随机数,则应首先考虑如何使用熊猫来实现这一目的。我可以立即想到两个:

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

df.x + np.random.randint(1, 4, size=len(df.x))

如果您将newvalue =行替换为其中之一,它将按预期运行。

相关问题