如何批量计算DataFrame中各Cow分组下各列的缺失值占比?
优化DataFrame分组计算缺失值占比的方案
需求背景
现有含100余列的DataFrame,需按Cow列分组,计算每组内其余所有列的缺失值占比。原方法需逐列计算后合并,重复工作量极大,需精简实现。
示例数据
生成代码
import pandas as pd import numpy as np mast_model_data = [[1152, '1', '10', '23'], [1154, '1', '4', '43'], [1155, 'NA', '3', '76'], [1152, '1', '10', 'NA'], [1155, '2', '10', '65'], [1152, '1', '4', 'NA']] df = pd.DataFrame(mast_model_data, columns =['Cow', 'Lact', 'Procedure', 'Height']) df.loc[:,'Lact'] = df['Lact'].replace('NA', np.nan) df.loc[:,'Procedure'] = df['Procedure'].replace('NA', np.nan) df.loc[:,'Height'] = df['Height'].replace('NA', np.nan)
生成的DataFrame
Cow Lact Procedure Height 0 1152 1 10 23 1 1154 1 4 43 2 1155 NaN 3 76 3 1152 1 10 NaN 4 1155 2 10 65 5 1152 1 4 NaN
原冗余实现(仅作对比)
df1 = (df.groupby('Cow')['Lact'] .apply(lambda x: np.mean(x.isna().to_numpy(), axis=None)) .reset_index(name='Lact')) df2 = (df.groupby('Cow')['Procedure'] .apply(lambda x: np.mean(x.isna().to_numpy(), axis=None)) .reset_index(name='Procedure')) df3 = (df.groupby('Cow')['Height'] .apply(lambda x: np.mean(x.isna().to_numpy(), axis=None)) .reset_index(name='Height')) missing = df1.merge(df2, on=['Cow'], how="left") missing = missing.merge(df3, on=['Cow'], how="left")
原代码输出
Cow Lact Procedure Height 0 1152 0.0 0.0 0.666667 1 1154 0.0 0.0 0.000000 2 1155 0.5 0.0 0.000000
优化后精简实现
方案一(最简洁)
直接对分组后的子DataFrame批量计算所有列的缺失值占比:
missing = df.groupby('Cow').apply(lambda x: x.isna().mean()).reset_index()
方案二(更高效)
使用agg方法指定聚合逻辑,避免apply的额外开销,适合超大数据集:
missing = df.groupby('Cow').agg(lambda col: col.isna().mean()).reset_index()
优化后输出
两种方案均生成与原代码完全一致的结果:
Cow Lact Procedure Height 0 1152 0.0 0.0 0.666667 1 1154 0.0 0.0 0.000000 2 1155 0.5 0.0 0.000000
方案说明
- 无需逐列编写重复代码,自动处理所有非分组列,适配任意列数的场景
isna()将空值转为布尔值,mean()直接计算布尔值的均值(即缺失值占比)- 方案二的
agg方法性能优于apply,处理百万级以上数据时优势更明显
内容的提问来源于stack exchange,提问作者JohnH
相关产品推荐
相关产品推荐

