Lambda 作为 dask 数据框的应用函数
Lambda as apply function for dask dataframe
我正在尝试使用 lambda 作为函数在 for 循环中应用于 dask 数据帧,创建 dask 数据帧列表。
当我计算每个数据帧时,它们都使用最后一个 lambda 表达式而不是循环期间分配的表达式。
示例:
ddf = dataframe.from_pandas(pd.DataFrame([[1, 10],[1, 5],[2, 9],[2, 4]],
columns=['group', 'value']), npartitions=2)
ddfs = []
for val in [2, 100]:
ddfs.append(ddf.groupby('group').apply(lambda x : x.sum()+val))
输出:
ddfs[0].compute()
group value
2 104 113
1 102 115
ddfs[1].compute()
group value
2 104 113
1 102 115
我认为它们不应该与第一个应该相同
group value
2 6 15
1 4 17
什么给了?
这是 python 本身的范围界定问题。当函数执行时,它在全局范围内查找 val
的值,它是 not 绑定在函数闭包中。
要修复,您需要使用一个可选的关键字参数,该参数在声明时进行评估,因此绑定:
for val in [2, 100]:
ddfs.append(ddf.groupby('group').apply(lambda x, val=val: x.sum()+val))
我正在尝试使用 lambda 作为函数在 for 循环中应用于 dask 数据帧,创建 dask 数据帧列表。 当我计算每个数据帧时,它们都使用最后一个 lambda 表达式而不是循环期间分配的表达式。
示例:
ddf = dataframe.from_pandas(pd.DataFrame([[1, 10],[1, 5],[2, 9],[2, 4]],
columns=['group', 'value']), npartitions=2)
ddfs = []
for val in [2, 100]:
ddfs.append(ddf.groupby('group').apply(lambda x : x.sum()+val))
输出:
ddfs[0].compute()
group value
2 104 113
1 102 115
ddfs[1].compute()
group value
2 104 113
1 102 115
我认为它们不应该与第一个应该相同
group value
2 6 15
1 4 17
什么给了?
这是 python 本身的范围界定问题。当函数执行时,它在全局范围内查找 val
的值,它是 not 绑定在函数闭包中。
要修复,您需要使用一个可选的关键字参数,该参数在声明时进行评估,因此绑定:
for val in [2, 100]:
ddfs.append(ddf.groupby('group').apply(lambda x, val=val: x.sum()+val))