80 Gb文件-创建一个基于县列表提交数据的数据框

问题描述 投票:0回答:1

我正在使用Python处理80 Gb数据集。数据有30列和〜180,000,000行。

[我正在使用pd.read_csv中的块大小参数读取块中的数据,然后在其中循环访问数据以创建县及其相关频率的字典。

这就是我被困住的地方。有了县列表后,我想逐行遍历各个块,再对与每个县相关联的2-3个其他列的值求和,并将其放入新的DataFrame中。这大约是4列和3000行,这对于我的计算机来说更易于管理。

我真的不知道该怎么做,这是我第一次使用python处理大型数据集。

import pandas as pd
from collections import defaultdict

df_chunk = pd.read_csv('file.tsv', sep='\t', chunksize=8000000)
county_dict = defaultdict(int)

for chunk in df_chunk:
    for county in chunk['COUNTY']:
        county_dict[county] += 1

for chunk in df_chunk:
    for row in chunk:
    # I don't know where to go from here

我希望能够创建一个DataFrame,其中包含所有县的列,每个县的产品总销售量为“ 1”的列,每个县的产品销售的另一列,然后根据需要添加更多相同的列。

python pandas dataframe bigdata
1个回答
0
投票

主意

我不确定您是否有其他的数据(例如,在英国或美国)或countries(在世界范围内),所以我决定提供有关countries的数据。

想法是:

  • 按国家/地区对每个数据块进行分组。
  • 为此块生成部分结果,作为DataFrame,具有:
    • 每个感兴趣的列的总和(每个国家)。>>
    • 每个国家的行数。
  • [立即执行部分结果的级联,每个部分结果应包含块号,作为附加索引级别。
  • 垂直合并部分结果(由于附加的索引级别,每行都有不同的索引)。
  • 最终结果(总和和行数)可以计算为以上结果的总和,按组编号分组。
  • 测试数据

    源CSV文件包含国家名称和2列的总和(Tab分开):

    Country Amount_1    Amount_2
    Austria 41  46
    Belgium 30  50
    Austria 45  44
    Denmark 31  42
    Finland 42  32
    Austria 10  12
    France  74  54
    Germany 81  65
    France  40  20
    Italy   54  42
    France  51  16
    Norway  14  33
    Italy   12  33
    France  21  30
    

    出于测试目的,我假设块大小仅为5

    行:
    chunksize = 5
    

    解决方案

    主要处理循环(和准备步骤)如下:

    df_chunk = pd.read_csv('Input.csv', sep='\t', chunksize=chunksize)
    chunkPartRes = []   # Partial results from each chunk
    chunkNo = 0
    for chunk in df_chunk:
        chunkNo += 1
        gr = chunk.groupby('Country')
        # Sum the desired columns and size of each group
        res = gr.agg(Amount_1=('Amount_1', sum), Amount_2=('Amount_2', sum))\
            .join(gr.size().rename('Count'))
        # Add top index level (chunk No), then append
        chunkPartRes.append(pd.concat([res], keys=[chunkNo], names=['ChunkNo']))
    

    将上述部分结果合并为单个DataFrame

    ,但仍然从每个块获得单独的结果,请运行:
    chunkRes = pd.concat(chunkPartRes)
    

    对于我的测试数据,结果是:

                     Amount_1  Amount_2  Count
    ChunkNo Country                           
    1       Austria        86        90      2
            Belgium        30        50      1
            Denmark        31        42      1
            Finland        42        32      1
    2       Austria        10        12      1
            France        114        74      2
            Germany        81        65      1
            Italy          54        42      1
    3       France         72        46      2
            Italy          12        33      1
            Norway         14        33      1
    

    并生成最终结果,将所有块中的数据求和,但要保持国家/地区隔离,请运行:

    res = chunkRes.groupby(level=1).sum()
    

    结果是:

             Amount_1  Amount_2  Count
    Country                           
    Austria        96       102      3
    Belgium        30        50      1
    Denmark        31        42      1
    Finland        42        32      1
    France        186       120      4
    Germany        81        65      1
    Italy          66        75      2
    Norway         14        33      1
    
    © www.soinside.com 2019 - 2024. All rights reserved.