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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:09:01