【问题标题】:Strange behaviour in dask apply with loop of lambda functionsdask 中的奇怪行为适用于 lambda 函数循环
【发布时间】:2017-08-23 12:54:25
【问题描述】:

我不确定这是 dask 的错误还是 python 的功能。简单例子:

data = pd.DataFrame({'tags': [['dog'], ['cat', 'red'], ['cat'], ['cat', 'red'], ['cat', 'red'], ['dog', 'red']]})
print data

          tags
0       [dog]
1  [cat, red]
2       [cat]
3  [cat, red]
4  [cat, red]
5  [dog, red]

我想为每个标签创建“热列”

tags = ['cat', 'dog', 'red']

使用 dask:

data = dd.from_pandas(data, npartitions=4)

for tag in tags:
    data[tag] = data.tags.apply(lambda x: tag in x, meta=(tag, bool))

结果错误:

print data.compute()
         tags    cat    dog    red
0       [dog]  False  False  False
1  [cat, red]   True   True   True
2       [cat]  False  False  False
3  [cat, red]   True   True   True
4  [cat, red]   True   True   True
5  [dog, red]   True   True   True

似乎lambda 总是绑定到循环中的最后一个标签(red)。如果我手动展开循环,它可以正常工作。

使用普通的熊猫我没有这个问题。

部分解决方案

def is_in(items, value):
    return value in items

for tag in tags:
    data[tag] = data.tags.apply(is_in, value=tag, meta=(tag, bool))

我不太喜欢它,因为它迫使论点的顺序非常不自然。顺便说一句,我不确定是否理解了原始问题。

【问题讨论】:

    标签: python lambda scope dask


    【解决方案1】:

    答案在这里:What do (lambda) function closures capture?,它是关于 python 的词法作用域。

    更好的解决方案:使用 lambda 的默认值

    for tag in tags:
        data[tag] = data.tags.apply(lambda x, t=tag: t in x, meta=(tag, bool))
    

    【讨论】:

      猜你喜欢
      • 2013-11-15
      • 2023-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多