Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Dask dataframe apply在将局部变量作为参数传递时提供意外结果_Python_Pandas_Scope_Apply_Dask - Fatal编程技术网

Python Dask dataframe apply在将局部变量作为参数传递时提供意外结果

Python Dask dataframe apply在将局部变量作为参数传递时提供意外结果,python,pandas,scope,apply,dask,Python,Pandas,Scope,Apply,Dask,在for循环中调用daskDataFrame的apply方法时,我使用迭代器变量作为apply的参数,在以后执行计算时会得到意外的结果。此示例显示了以下行为: 导入dask.dataframe作为dd 随机输入 将numpy作为np导入 df=pd.DataFrame({'col_1':random.sample(范围(10000),10000), 'col_2':random.sample(范围(10000),10000)} ddf=dd.from_熊猫(df,npartitions=8) d

在for循环中调用dask
DataFrame
apply
方法时,我使用迭代器变量作为
apply
的参数,在以后执行计算时会得到意外的结果。此示例显示了以下行为:

导入dask.dataframe作为dd
随机输入
将numpy作为np导入
df=pd.DataFrame({'col_1':random.sample(范围(10000),10000),
'col_2':random.sample(范围(10000),10000)}
ddf=dd.from_熊猫(df,npartitions=8)
def myfunc(x,通道):
返回通道
对于CHIN['ch1','ch2']:
ddf[f'df_apply_{ch}]=ddf.apply(lambda行:myfunc(行,ch),axis=1,meta=(f'df_apply_{ch},np.unicode)
打印(ddf头(5))
myfunc
的行应用程序中,我希望看到两个额外的列,一个列上有“ch1”,另一个列上有“ch2”。但是,这是脚本的输出:

   col_1  col_2 df_apply_ch1 df_apply_ch2
0   5485   2234          ch2          ch2
1   6338   6802          ch2          ch2
2   9408   5760          ch2          ch2
3   8447   1451          ch2          ch2
4   1230   3838          ch2          ch2
显然,循环的最后一次迭代将第一个参数改写为
apply
。事实上,在循环和调用
head
之间对
ch
的任何后续更改都会以相同的方式影响结果,覆盖我在两列中预期看到的内容

这不是人们看到的用纯熊猫做同样的运动。我也为达斯克找到了一份工作:

def myapply(ddf,ch):
ddf[f'myapply{ch}']=ddf.apply(lambda行:myfunc(行,ch),axis=1,meta=(f'myapply{ch},np.unicode)
对于CHIN['ch1','ch2']:
myapply(ddf,ch)
打印(ddf打印头(10))
给出:

   col_1  col_2 myapply_ch1 myapply_ch2
0   7394   3528         ch1         ch2
1   2181   6681         ch1         ch2
2   7945   1063         ch1         ch2
3   5164   8091         ch1         ch2
4   3569   2889         ch1         ch2
所以我看到这与用作应用参数的变量的范围有关,但我不明白为什么dask(仅)会发生这种情况。这是预期/预期的行为吗


如有任何见解,将不胜感激!:)

这最终证明是重复的,请参见包含另一个解决方法。有关该行为的更详细解释,请参见相应的:

这不是bug,这只是python的工作方式。闭包根据定义范围进行计算,如果更改该范围中
trig
的值,则闭包的计算结果将不同。 这里的问题是,这段代码在pandas中运行良好,因为每个循环中都有一个求值,但在dask中,所有求值都会延迟到以后,因此所有求值都使用相同的
trig

其中,
trig
是该讨论中使用的循环中的变量

因此,这不是一个bug,也不是由dask触发的Python特性,而不是pandas