繁体   English   中英

通过一次更改一列,使用 Dask 高效加载和存储数据

[英]Efficiently load and store data using Dask by changing one column at a time

我正在使用 Dask 和 Pandas 数据帧实现 csv 解析器。 我想让它只加载它需要的列,所以它可以很好地工作并且不需要加载大量数据。

目前,我发现将列写入 parquet/Dask 数据帧的唯一方法是将所有数据加载为 Pandas 数据帧,修改列并从 Pandas 转换。

all_data = self.data_set.compute()              # Loads all data, compute to pandas dataframe
all_data[column] = column_data                  # Modifies one column
self.data_set = dd.from_pandas(all_data, npartitions=2) # Store all data into dask dataframe

这似乎非常低效,所以我正在寻找一种方法来避免加载所有数据,并且可能一次修改一列或直接写入 parquet。

我已经删除了大部分代码,但这里有一个示例函数,旨在对仅一列的数据进行规范化。

import pandas as pd
import dask.dataframe as dd

def normalise_column(self, column, normalise_type=NormaliseMethod.MEAN_STDDEV):
  column_data = self.data_set.compute()[column] # This also converts all data to pd dataframe
  
  if normalise_type is NormaliseMethod.MIN_MAX:
    [min, max] = [column_data.min(), column_data.max()]
    column_data = column_data.apply(lambda x: (x - min) * (max - min))

  elif normalise_type is NormaliseMethod.MEAN_STDDEV:
    [mean, std_dev] = [column_data.mean(), column_data.std()]
    column_data = column_data.apply(lambda x: (x - mean) / std_dev)

  all_data = self.data_set.compute()
  all_data[column] = column_data
  self.data_set = dd.from_pandas(all_data, npartitions=2)

有人可以帮我提高处理大量数据的效率吗?

由于 parquet 格式的二进制性质,并且压缩通常应用于列块,如果没有完整的加载-过程-保存周期(字节数),则永远不可能更新文件中列的值不会保持不变)。 至少,Dask 应该使您能够逐个分区执行此操作,而不会破坏内存。

有可能使自定义代码,以避免解析列压缩的二进制数据,你知道你不想改变,只是读,写一遍,但实现这将需要一些工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM