Pandas实现链式条件计数:统计表单连续填写列数
Pandas实现连续已填写列统计(满足前置列均已填写)
嘿,这个需求我刚好处理过,你的掩码思路完全正确,而且用Pandas内置的方法就能高效实现,咱们一步步来拆解:
核心思路
要统计所有前置列均已填写的连续已填写列数,本质是要找到从第一列开始,连续的、没有空值的列段——只要某一列出现空值,那它及之后的列都不再符合条件。用累积逻辑与(cummin)就能完美实现这个判断:一旦遇到空值(对应布尔掩码的False),后续所有位置都会被标记为False,正好对应“前置列存在未填写”的情况。
具体实现步骤
假设你的DataFrame中空值用NaN表示(如果是空字符串等其他空值形式,只需调整掩码生成逻辑即可):
1. 生成填写状态掩码
先把每个单元格转换成“是否已填写”的布尔值:非空为True,空值为False
mask = df.notna()
2. 计算累积有效掩码
沿着行方向做累积最小值(对布尔值来说,cummin等价于累积逻辑与),这样只要前面有一列未填写(False),后续所有列都会被标记为False:
cumulative_valid = mask.cummin(axis=1)
3. 统计每行的连续有效列数
对每行的cumulative_valid求和,得到的就是满足条件的连续已填写列数量:
result = cumulative_valid.sum(axis=1)
完整示例
我们用一个模拟数据来验证:
import pandas as pd import numpy as np # 构造示例DataFrame data = { '姓名': ['张三', '李四', np.nan, '王五'], '年龄': [25, np.nan, 30, 28], '手机号': ['138xxxx1234', '139xxxx5678', '137xxxx9012', '136xxxx3456'], '邮箱': ['zhangsan@xxx.com', 'lisi@xxx.com', 'wangwu@xxx.com', np.nan] } df = pd.DataFrame(data) # 执行统计 mask = df.notna() cumulative_valid = mask.cummin(axis=1) result = cumulative_valid.sum(axis=1) # 查看结果 print(result)
输出结果:
0 4 1 1 2 0 3 3 dtype: int64
结果解释:
- 张三所有列都已填写,统计为4
- 李四只有第一列(姓名)已填写,第二列(年龄)为空,后续列都不满足条件,统计为1
- 第三行第一列(姓名)为空,直接统计为0
- 王五前3列都已填写,第四列(邮箱)为空,统计为3
适配其他空值类型
如果你的空值是其他形式(比如空字符串''、None),只需调整掩码生成逻辑:
# 处理空字符串 mask = df.applymap(lambda x: x != '') # 同时处理None和空字符串 mask = df.applymap(lambda x: x is not None and x.strip() != '')
为什么这个方法最优?
- 完全利用Pandas的向量化操作,避免了循环,处理大DataFrame时效率极高
- 逻辑清晰,
cummin的行为正好匹配需求,代码简洁易维护
内容的提问来源于stack exchange,提问作者GappedState
相关产品推荐
相关产品推荐

