提问人:Lionel Peer 提问时间:1/11/2023 更新时间:1/11/2023 访问量:411
在 Python Polars 中将函数应用于列内存不足
apply function to column out-of-memory in Python Polars
问:
我有一个大型 GIS 数据集 (167x25e6),它是通过 .csv 到现在的 parquet 从 GeoJSON 生成的。这是我第一次真正需要处理内存不足的数据帧,我仍在努力找出 Polars 是否是我任务的正确选择,所以如果您知道使用不同库的解决方案,我同样很高兴知道这一点。
懒惰地加载文件没有问题,但我需要转换某些值,这就是我卡住的地方。由于数据来自GeoJSON,例如,我有一个列,其中包含坐标对的字符串列表:。'geometry.coordinates'
'[[122.9491889477, 24.4571703672], [122.946780324, 24.4541877508]]'
在上面列的示例中,我需要应用一个函数,该函数返回平均经度和平均纬度,并将其写入新列。
我尝试将列转换为数据类型,并尝试与执行 JSON 字符串加载的 lambda 一起使用:pl.List
apply
df_pl.select(pl.col('geometry.coordinates')).with_column(pl.col('geometry.coordinates').cast(pl.List)).collect()
df_pl.select(pl.col('geometry.coordinates')).with_column(pl.col('geometry.coordinates').apply(lambda x: json.loads(x)).collect()
不幸的是,第一个抛出一个 NotYetImplementedError: Casting from LargeUtf8 to LargeList not supported。第二个使 Python 内核立即崩溃,因为它没有内存。
我尝试的另一件事是,我可以将结果流式传输到磁盘,然后与实际需要的数据合并,但这会引发 PanicException:sink_parquet标准引擎尚不支持。使用 'collect().write_parquet()'sink_parquet
collect
感谢您的帮助!
答: 暂无答案
评论
but this throws a PanicException: sink_parquet not yet supported in standard engine. Use 'collect().write_parquet()'
- 确切地说,当您使用任何过滤器/谓词或联接时,就会发生这种情况