pandas通过lambda遍历所有行统计排除NA/NULL的已填充字段数的问题
原有代码核心问题排查
- 列选取语法错误:pandas选取多列时需传入由列名组成的列表,原代码直接在单层方括号内用逗号分隔列名,会被识别为单个元组键触发KeyError,且
'project_c'列名缺少闭合引号,直接触发语法错误。 - 缺失值判断逻辑失效:原判断条件
x != "NA" or np.nan完全不符合预期,一方面np.nan与任意值比较都会返回False,无法真正识别空值,另一方面条件混用了常量对象,无法实现“排除字符串NA、空值的有效统计”逻辑。 - apply作用粒度错误:原lambda逻辑是对单元格做值判断累加,没有按行维度聚合统计有效单元格数量,无法输出每行的统计结果。
正确实现方案
首先需要统一识别两类无效值:文本形式的"NA"、pandas标准空值(np.nan、None),再按行统计有效填充数,以下是两种可直接运行的实现:
- 适配lambda逐行处理需求的写法
import numpy as np import pandas as pd # 统一将文本"NA"替换为pandas可识别的标准缺失值 proj_table = proj_table.replace("NA", np.nan) # 明确需要统计的列范围 stat_columns = ['project_id', 'project_a', 'project_b', 'project_c', 'project_d', 'project_e'] # 按行(axis=1)应用lambda统计非空值数量 proj_table['field_populated'] = proj_table[stat_columns].apply( lambda row: row.notna().sum(), axis=1 )
- 性能更优的向量化写法(适配大数据量场景,无需逐行遍历)
import numpy as np stat_columns = ['project_id', 'project_a', 'project_b', 'project_c', 'project_d', 'project_e'] proj_table['field_populated'] = ( proj_table[stat_columns] .replace("NA", np.nan) .notna() .sum(axis=1) )
以上两种写法的输出结果和示例期望完全匹配:逐行统计时会自动跳过所有文本"NA"、空值,累计有效填充的单元格数。
内容的提问来源于stack exchange,提问作者freak7
相关产品推荐
相关产品推荐

