代码之家  ›  专栏  ›  技术社区  ›  CaffeinatedMike

如何使用'pandas`/'dask`以内存友好的方式规范化google bucket中12k csv文件(50gb)中的列?

  •  0
  • CaffeinatedMike  · 技术社区  · 3 年前

    我有大约12000个csv文件(50gb)存储在一个google bucket中,这些文件具有几乎相似的列结构。 但是,也存在一些差异。 尤其是:

    • 并非所有文件都有所有列。
    • 某些文件的标题行不是从第一行开始的。相反,可能会有一个合并的单元格块,它占据前几行和前几列,提供用于生成报告的报告参数的摘要。

    目标概述:

    1. 从所有文件中收集列标题的广泛列表
    2. 使用列标题的广泛列表来规范化所有文件,以便它们具有匹配的模式
      • 删除标题行之前的所有行
      • 向每个文件添加任何缺少的列
      • 将文件名和google存储文件夹路径作为静态列添加到每个文件中

    伪代码思维过程

    光标前: 我对如何处理这个问题有点迷茫,因为我对这个问题不是很在行 pandas / numpy .但是,我对实现这一目标需要采取的步骤有一个大致的想法。

    1. 使用 pandas.read_csv(..., nrows=25) 查看每个文件的内容
    2. 也许可以查看工作表x范围的总列数与每行的列数,以确定何时到达标题列行?
    3. 总是分配 str 每一列 dtype (以降低内存使用率)
    4. ?

    注: 所使用的机器仅限于16gb RAM,由于存储限制,在本地下载整个文件夹也是不可行的。

    一旦文件被规范化,我就可以创建一个BigQueryLoadJob来接收文件数据。

    0 回复  |  直到 3 年前
        1
  •  0
  •   SultanOrazbayev    3 年前

    如果所有列都从第一行开始,我会使用如下内容(未测试):

    from dask import delayed, compute
    @delayed
    def get_cols(file):
        cols = pd.read_csv(file, nrows=1).columns 
        return {'file': file, 'cols': cols}
    
    from glob import glob
    files = glob('*csv') # or an appropriate list of files
    cols = compute([get_cols(f) for f in files])
    

    接下来,我将把COL转换成一个数据帧,并创建一个令人满意的方案。这取决于你的数据和目标,所以在这里没什么帮助。

    由于存在文件不从第一行开始的问题,我将使用 try/except get_cols 或者实现另一个逻辑来获取列名,这也取决于数据,因此在这里无法提供更多帮助。