大熊猫' chunked'在非常大的数据帧上保存数据透视表的to_csv

时间:2016-09-07 11:13:31

标签: python csv pandas

我要转移的原始文件对于内存非常大:

tbl = pd.read_csv('tbl_sale_items.csv',sep=';',dtype={'saleid': np.str, 'upc': np.str})
tbl.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 18570726 entries, 0 to 18570725
Data columns (total 2 columns):
saleid    object
upc       object
dtypes: object(2)
memory usage: 283.4+ MB

独特的UPC约为40000,SALEID行约为一百万+。

该文件如下:

    saleid                              upc
0   155_02127453_20090616_135212_0021   02317639000000
1   155_02127453_20090616_135212_0021   00000000000888
2   155_01605733_20090616_135221_0016   00264850000000
3   155_01072401_20090616_135224_0010   02316877000000
4   155_01072401_20090616_135224_0010   05051969277205

它代表一个客户(saleid)和他/她获得的项目(项目的upc)

我使用此solution正确旋转表格。

                                   02317639000000 00000000000888 00264850000000 02316877000000
155_02127453_20090616_135212_0021               1              1              0              0
155_01605733_20090616_135221_0016               0              0              1              0
155_01072401_20090616_135224_0010               0              0              0              0

因此,列是唯一的UPC,行是唯一的SALEID。

无法将这么大的文件转移到内存中(即使是128gb) 我尝试阅读并将其保存在块中:

chunksize = 1000000
f = 0
for chunk in pd.read_csv('tbl_sale_items.csv',sep=';',dtype={'saleid': np.str, 'upc': np.str}, chunksize=chunksize):
    print(f)
    t = pd.crosstab(chunk.saleid, chunk.upc)
    t.head(3)
    t.to_csv('tbl_sales_index_converted_' + str(f) + '.csv.bz2',header=True,sep=';',compression='bz2')
    f = f+1

但是!这样生成的透视表只有块中存在的列中的唯一UPC,通常大约25000,而不是所有应该在40000左右的列。 我当然需要一致的列数和列数。

如何以块的形式读取,转移和写入csv,还要在所有生成的CSV上保留统一的列结构?

0 个答案:

没有答案