Dataframe Dask为什么要填写;"富",;在我的数据框中是1
我已经阅读了大约15个csv文件:Dataframe Dask为什么要填写;"富",;在我的数据框中是1,dataframe,dask,dask-distributed,Dataframe,Dask,Dask Distributed,我已经阅读了大约15个csv文件: df = dd.read_csv("gs://project/*.csv", blocksize=25e6, storage_options={'token': fs.session.credentials}) 然后我持久化了数据帧(它使用7.33 GB内存): 我设置了一个新索引,因为我希望该字段上的group by尽可能高效: df = df.set_index('column_a').persist() 现在我有18
df = dd.read_csv("gs://project/*.csv", blocksize=25e6,
storage_options={'token': fs.session.credentials})
然后我持久化了数据帧(它使用7.33 GB内存):
我设置了一个新索引,因为我希望该字段上的group by尽可能高效:
df = df.set_index('column_a').persist()
现在我有181个分区和180个分区。
为了测试group by的运行速度,我尝试了一个只打印group Dataframe的自定义应用函数:
grouped_by_index = df.groupby('column_a').apply(lambda n: print(n)).compute()
使用正确的列打印数据帧,但值为“1”、“foo”或“True”。例如:
column_b column_c column_d column_e column_f column_g \
index
a foo 1 foo 1 1 1
我还得到警告:
/opt/conda/lib/python3.7/site-packages/ipykernel_-launcher.py:1:
用户警告:meta
未指定,从部分数据推断。
如果结果出乎意料,请提供meta
。之前:
.apply(func)在:.apply(func,meta={'x':'f8','y':'f8'})之后
数据帧结果或:.apply(func,meta=('x','f8'))对于series result“”,启动IPython内核的入口点
这里发生了什么?事实上,如果您阅读
apply
的文档,您将看到meta=
是一个可以传递的参数,它告诉Dask如何期望操作的输出。这是必要的,因为apply
可以做非常一般的事情
如果您不提供meta=
,在您的情况下,Dask将尝试使用一个示例迷你数据框为操作设定种子,其中任何数字列包含1,文本列包含“foo”,只是为了查看输出结果。因为在apply
中打印(实际上不返回任何内容),所以您看到了这个种子
正如文档所建议的,如果可能的话,最好提供
meta=
,这样就可以避免整个过程。当我提供元数据时,会出现错误:AttributeError:'DataFrame'对象没有属性“name”
。我这样定义元数据:meta={'project':'object','net':'int64','no':'object','v':'int64','min':'int64','avg':'int64','associated':'bool'}
。我认为这应该行得通,但最好提供一个零长度的数据帧。我这样定义了meta:meta=('visions',object)
这就成功了,感谢您的帮助。啊,是的-您定义的是输出,它只是一组None
值(因为您不从lambda返回任何内容)。
column_b column_c column_d column_e column_f column_g \
index
a foo 1 foo 1 1 1