You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用更高效、更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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:18:17