[英]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.