旋转熊猫数据框时保留每个垃圾箱

时间:2020-05-22 14:06:26

标签: python pandas

我有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会顺序更新?

1 个答案:

答案 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_xbin_y为NaN的行。