我正在使用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”的列,每个县的产品销售的另一列,然后根据需要添加更多相同的列。
我不确定您是否有其他县的数据(例如,在英国或美国)或countries(在世界范围内),所以我决定提供有关countries的数据。
想法是:
源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