Dask的map_partitions传DataFrame类型meta报错无name属性如何解决
报错根因
你当前测试用的mytest函数返回值是Pandas Series类型,但你传入的meta是DataFrame类型,二者类型不匹配,因此触发'DataFrame' object has no attribute 'name'报错——Series本身有name属性,而DataFrame没有,Dask做元数据校验时属性不匹配就抛出了异常。
对应解决方案
单列返回(Series类型)
如果你的函数确实返回单列,除了你现在用的元组写法,也可以显式传空Series作为meta:
meta = pd.Series(dtype='i8', name='Bedrooms')
多列返回(DataFrame类型,你实际需要的场景)
首先确保自定义函数的返回值是DataFrame类型,不要返回Series,再构造匹配结构的meta即可,示例如下:
- 调整自定义函数,返回DataFrame
def mytest(self, df): # 示例:返回两列的DataFrame,你可以替换成自己的逻辑,只要最终返回DataFrame即可 return df[['Bedrooms', 'Area']]
- 构造对应meta,两种常用写法都可:
- 写法1:显式构造空DataFrame
meta = pd.DataFrame({ 'Bedrooms': pd.Series(dtype='i8'), 'Area': pd.Series(dtype='f8') })
- 写法2:用字典指定列名与对应dtype,更简洁
meta = {'Bedrooms': 'i8', 'Area': 'f8'}
小提示
如果不确定返回结果的结构,可以先取Dask DataFrame的一小部分数据(比如用df.head()得到Pandas对象),传入你的自定义函数运行,根据返回结果的结构、dtype来构造meta,就能避免类型不匹配的问题。
内容的提问来源于stack exchange,提问作者user2267354
相关产品推荐
相关产品推荐

