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

如何无需循环用pd.merge对DataFrame多列进行列级均值计算?

合并多列并计算空值占比的无循环优化方案

问题背景

现有一段合并两个DataFrame并计算特定列空值占比的代码:

pd.merge(df_old.loc[~df_old['COL1'].isnull()],
         df_new,
         on='ID')['COL1_y'].isnull().mean()

需要对COL2、COL3等多列逐列执行该逻辑,得到每列对应的空值占比。当前采用循环实现:

src = pd.Series()
for col in ['COL1', 'COL2', 'COL3']:
    src[col] = pd.merge(df_old.loc[~df_old[col].isnull()],
                        df_new,
                        on='ID')[col+'_y'].isnull().mean()

询问是否有更优的无循环实现方式。

优化方案

你的循环方案存在重复执行merge操作的问题,每次循环都要合并一次DataFrame,数据量较大时效率极低。可以通过一次合并+批量计算完成优化,步骤如下:

  1. 先执行一次全量合并,保留所有需要处理的列:
merged_df = pd.merge(df_old, df_new, on='ID', suffixes=('_old', '_new'))
  1. 针对目标列列表,批量计算每列的空值占比:
cols = ['COL1', 'COL2', 'COL3']
result = pd.Series({
    col: merged_df.loc[~merged_df[f'{col}_old'].isnull(), f'{col}_new'].isnull().mean()
    for col in cols
})

也可以用更简洁的列表推导式写法:

cols = ['COL1', 'COL2', 'COL3']
result = pd.Series(
    [merged_df.loc[~merged_df[f'{col}_old'].isnull(), f'{col}_new'].isnull().mean() 
     for col in cols],
    index=cols
)

核心优化点

  • 仅执行一次merge操作,避免重复计算,大幅提升运行效率
  • 利用pandas矢量化特性替代循环,符合框架最佳实践
  • 代码结构更简洁,便于后续维护和扩展

内容的提问来源于stack exchange,提问作者Sunil Shukla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:41:19