如何无需循环用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,数据量较大时效率极低。可以通过一次合并+批量计算完成优化,步骤如下:
- 先执行一次全量合并,保留所有需要处理的列:
merged_df = pd.merge(df_old, df_new, on='ID', suffixes=('_old', '_new'))
- 针对目标列列表,批量计算每列的空值占比:
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
相关产品推荐
相关产品推荐

