上下文序言:
我有一个示例csv文件,它的列比行多(大约300比190(,在处理整个8000万条记录之前,我正在尝试了解它是如何工作的。我正在做一个谷歌colab笔记本。
我想做的事情:
读取CSV文件,对所有列执行value_counts((并保存结果
这是代码,我保持原样:
import dask.dataframe as dd
import pandas as pd
# Here we're reading the csv
dfd = dd.read_csv(
'drive/MyDrive/csvs/sample.csv',
delimiter=';',
# Down below we specify the types of the first columns
dtype = {'ID': object, 'BSID': 'UInt32', 'CAM': 'UInt32',
'AGZ': 'UInt32', 'Zen': 'UInt16', 'taw': 'UInt16'
},
blocksize=64000000 # = 64 Mb chunks
)
# Here we convert the rest of the ~300 columns to UInt8
cols=[i for i in dfd.columns if i not in ['ID', 'BSID', 'CAM',
'AGZ', 'Zen', 'taw']]
for col in cols:
dfd[col]=dfd[col].astype('UInt8')
# value_counts
for col in dfd.columns:
result = dfd[col].value_counts()
result.to_csv('drive/MyDrive/csvs/Value_counts-' + col + '.csv')
出了什么问题:
执行代码时,结果将作为名为0.part的文件存储在按照Value_counts-' + col + '.csv
模式命名的文件夹中。我希望它被保存为csvs
文件夹中的Value_counts-' + col + '.csv
文件。
为什么会发生这种情况?
附加问题:
我能以更好的方式为所有列运行value_counts((吗?
请参阅文档
single_file:bool,默认错误
是否将所有内容保存到单个CSV文件中。单下文件模式,每个分区都附加在指定CSV的末尾文件
在您的情况下,每个输出只有一个分区(part.0(,但Dask不知道您不需要从多个块进行并行写入,所以您需要帮助它。
有更好的方法吗?好吧,听起来你的列比分区多得多,所以你可以做dfd.map_partitions(pd.DataFrame.value_counts)
和sum
的部分。