【问题标题】:Apply values to Dask dataframe mapping with function使用函数将值应用于 Dask 数据帧映射
【发布时间】:2021-05-25 02:48:43
【问题描述】:

在下面的 Dask 代码中,我试图根据函数apply_masks 中的逻辑设置数据帧字段的值:

import numpy as np
import pandas as pd
import dask.dataframe as daskDataFrame

def apply_masks(df):
   if df['Age'] > 14:
       df['outcol'] = 6
   else:
       df['outcol'] = 5
   return df

data = [[1,100, 12, 6], [1,200, 18, 5], [1,170, 22, 4]]
df = pd.DataFrame(data, columns = ['outcol', 'Weight', 'Age', 'Height']) 
ddf = daskDataFrame.from_pandas(df, npartitions=100)
ddf = ddf.map_partitions(apply_masks)
print(ddf.compute())

问题是得到一个异常:

ValueError:apply_masks 中的元数据推断失败。

您提供了一个自定义函数,但 Dask 无法确定 该函数返回的输出类型。

要解决此问题,请提供 meta= 关键字。的文档字符串 您运行的 Dask 函数应该有更多信息。

原始错误如下: ------------------------ ValueError('一个Series的真值不明确。使用a.empty, a.bool(), a.item ()、a.any() 或 a.all().')

如何解决这个问题?

【问题讨论】:

  • df['Age'] > 14 给出了一系列布尔值,例如[True, False, True, True] 等...您是否尝试将所有Age > 14 的输出设置为6 并为所有其他年龄设置5
  • 是的,就是这样

标签: python pandas dask dask-distributed


【解决方案1】:

试试assign + np.where:

def apply_masks(df):
    return df.assign(outcol=np.where(df['Age'] > 14, 6, 5))

结果:

   outcol  Weight  Age  Height
0       5     100   12       6
1       6     200   18       5
2       6     170   22       4

【讨论】:

  • 这适用于我有两个可能值 6 和 5 的情况,但我正在寻找一种通用方法。如果基于Age 我有100 个可能的值分配给outcol 怎么办?
  • 我想说您可能正在寻找cut。但是,由于您的问题没有提及其他类别,或者它们的分配方式,这只是一个猜测。如果您更新您的问题以包含其中一些类别的一些信息,我可以基于此更新我的答案。
猜你喜欢
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多