为了账号安全,请及时绑定邮箱和手机立即绑定

将 lambda 函数应用于 dask 数据帧

将 lambda 函数应用于 dask 数据帧

侃侃无极 2021-11-23 19:59:37
我希望将一个lambda函数应用于 dask 数据框以更改列中的标签,如果它小于某个百分比。我使用的方法适用于 Pandas 数据帧,但相同的代码不适用于 dask 数据帧。代码如下。df = pd.DataFrame({'A':['ant','ant','cherry', 'bee', 'ant'], 'B':['cat','peach', 'cat', 'cat', 'peach'], 'C':['dog','dog','roo', 'emu', 'emu']})ddf = dd.from_pandas(df, npartitions=2)df:输出:     A     B      C0   ant    cat   dog1   ant    peach dog2   cherry cat   roo3   bee    cat   emu4   ant    peach emuddf.compute()输出:     A     B      C0   ant    cat   dog1   ant    peach dog2   cherry cat   roo3   bee    cat   emu4   ant    peach emulist_ = ['B','C']df.apply(lambda x: x.mask(x.map(x.value_counts(normalize=True))<.5, 'other') if x.name not in list_ else x)输出:     A     B      C0   ant    cat   dog1   ant    peach dog2   other  cat   roo3   other  cat   emu4   ant    peach emu对 dask 数据框执行相同操作:ddf.apply(lambda x: x.mask(x.map(x.value_counts(normalize=True))<.5, 'other') if x.name not in list_ else x,axis=1).compute()输出(给出警告而不是所需的输出):/home/michael/env/lib/python3.5/site-packages/dask/dataframe/core.py:3107: UserWarning: `meta` is not specified, inferred from partial data. Please provide `meta` if the result is unexpected.  Before: .apply(func)  After:  .apply(func, meta={'x': 'f8', 'y': 'f8'}) for dataframe result  or:     .apply(func, meta=('x', 'f8'))            for series result  warnings.warn(msg)      A       B       C0   other   other   other1   other   other   other2   other   other   other3   other   other   other4   other   other   other有人可以帮助我获得 dask 数据帧实例所需的输出。
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

在 pandas 和 dask 情况下,您没有执行相同的操作:对于后者,您有axis=1,因此您最终会替换给定行中出现少于两次的任何值,即所有这些值。


如果您更改为axis=0,您将看到您收到异常。这是因为要计算第一个分区,您还需要将整个数据帧传递给 lambda 函数 - 否则如何获得 value_counts?


您的问题的解决方案是分别获取值计数。您可以显式地计算它(结果很小)或将其传递给 lambda。此外请注意,走这条路意味着您可以避免使用apply赞成map和使事情更加明确。在这里我专门选择一列,你可以循环。


vc = ddf.A.value_counts().compute()

vc /= vc.sum()  # because dask's value_count doesn't normalise


def simple_map(df):

    df['A'] = df['A'].map(lambda x: x if vc[x] > 0.5 else 'other')

    return df


ddf.map_partitions(simple_map, meta=df[:0]).compute()


查看完整回答
反对 回复 2021-11-23
  • 1 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信