如何用更高效、更Pythonic的方式填充8000×30矩阵?
高效替代嵌套循环汇总DataFrame数据的方案
问题场景
- DataFrame A:8000行×30列,以DataFrame B的唯一ID为索引,B的所有Product_ID为列,用于汇总B中的非唯一数据
- DataFrame B:共20000行,包含
ID、Product_ID、Quantity三列
当前使用嵌套循环实现汇总,代码如下:
for i in a_df.index: for j in a_df.columns: a_df.at[i,j] = b_df.loc[ (b_df['ID'] == i) & (b_df['Product_ID'] == j) ]['Quantity'].sum()
该方案因嵌套遍历+每次循环的布尔索引查询,运行效率极低,以下是两种高效的替代方案。
方案1:使用pivot_table直接生成汇总表
利用pandas内置的透视表功能,一次性完成分组求和和格式重塑,完全矢量化操作,性能远超循环:
# 生成与原a_df逻辑一致的汇总表,空值填充为0 a_df_optimized = b_df.pivot_table( index='ID', columns='Product_ID', values='Quantity', aggfunc='sum', fill_value=0 )
方案2:分组聚合后用unstack重塑
先通过groupby分组求和,再将行索引中的Product_ID转为列,同样是矢量化操作:
# 按ID和Product_ID分组求和 grouped = b_df.groupby(['ID', 'Product_ID'])['Quantity'].sum() # 重塑为宽表,空值填充为0 a_df_optimized = grouped.unstack(fill_value=0)
对齐原DataFrame结构(可选)
如果需要和原a_df的索引、列顺序完全一致,可使用reindex调整:
a_df_optimized = a_df_optimized.reindex(index=a_df.index, columns=a_df.columns, fill_value=0)
内容的提问来源于stack exchange,提问作者user21323549
相关产品推荐
相关产品推荐

