Python 熊猫';分块';保存到非常大的数据帧上的数据透视表的csv

Python 熊猫';分块';保存到非常大的数据帧上的数据透视表的csv,python,csv,pandas,Python,Csv,Pandas,我的原始pivot文件内存非常大: 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 obj

我的原始pivot文件内存非常大:

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
它代表一个客户(saleid)和他/她获得的物品(物品的upc)

我用这个正确地旋转桌子

因此,列是唯一的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上保持统一的列结构?

您需要为每个块添加
mode='a'
,作为
的参数添加到\u csv
您真的需要upcs作为列吗?我不确定您的确切要求,但有一个saleid和upc的多索引,用一列作为计数,肯定更有意义
tbl.groupby(['saleid','upc']).size()
更有意义…@EdChum我不知道你的意思@Ninjappy我需要所有UPC作为列,每个saleID(客户订单)为0/1,因为我将使用机器学习的数据。所以我需要一致的输入大小和输入顺序。您在每次要追加的迭代中都会覆盖,不是吗?尝试
t.to_csv('tbl_sales_index_converted_'+str(f)+'.csv.bz2',header=True,sep=';',compression='bz2',mode='a')
您需要为每个区块添加
mode='a'
作为
to_csv
的参数,您真的需要UPC作为列吗?我不确定您的确切要求,但有一个saleid和upc的多索引,用一列作为计数,肯定更有意义
tbl.groupby(['saleid','upc']).size()
更有意义…@EdChum我不知道你的意思@Ninjappy我需要所有UPC作为列,每个saleID(客户订单)为0/1,因为我将使用机器学习的数据。所以我需要一致的输入大小和输入顺序。您在每次要追加的迭代中都会覆盖,不是吗?尝试
t.to_csv('tbl_sales_index_converted_'+str(f)+'.csv.bz2',header=True,sep=';',compression='bz2',mode='a')
                                   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
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