我有12个不同的数据帧,由于系统限制,我只能按顺序加载到内存中。
目标是在不同数据集的每次迭代中更新箱计数;每个的预处理管道如下:
ID duration_vs_delay_30 delay_hour_vs_delay_30
0 1 1.12 1.12
1 4 1.13 1.13
2 5 1.21 1.21
3 6 2.1 1.7
4 10 1.95 1.9
因此,我将两个数字列与两个定义的列表进行装箱,并使用数据透视表对每个箱中的所有值求和:
# Define bins
y_axis = [1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5]
x_axis = [1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0]
chunk['bin_y_axis'] = pd.cut(chunk.delay_hour_vs_delay_30, y_axis)
chunk['bin_x_axis'] = pd.cut(chunk.duration_vs_delay_30, x_axis)
chunk["count_route"] = 1
然后,如果我们在第一次迭代中,则使用以下内容:
bin_df = chunk.pivot_table(index='bin_x_axis', columns='bin_y_axis', values='count_route',
aggfunc = np.sum, fill_value = 0)
其他:
chunk = chunk.pivot_table(index='bin_x_axis', columns='bin_y_axis', values='count_tratta',
aggfunc = np.sum, fill_value = 0)
bin_df = bin_df + chunk
但是,如果当前块未在定义的bin中包含所有值,则我获得的列和行数少于其应有的列和行的数据帧。
如何纠正此错误,以便列和行包含所有bin,并且主bin_df会顺序更新?
答案 0 :(得分:0)
遍历每个文件时,请为每个(bin_x, bin_y)
元组保留一个运行总计,并保存最后一个数据透视表:
summary = None
# Lop through your files
for file in ...
# ... process the file ...
chunk_summary = chunk.groupby(['bin_x_axis', 'bin_y_axis']).size()
if summary is None:
summary = chunk_summary
else:
summary += chunk_summary
# Save the pivot operation for the last
bin_df = summary.unstack()
注意:您的垃圾箱并未覆盖所有值,因此某些行已分配给垃圾箱NaN。 groupby
忽略bin_x
或bin_y
为NaN的行。