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

在Pandas中按指定规则逐行校验DataFrame列值填充情况

实现Pandas DataFrame的逐行规则校验

先还原你的DataFrame:

import pandas as pd
df = pd.DataFrame({1: [2, 4, 0, 0, 2], 2: [5, 6, 0, 0, 34], 3:[6,12,0,3,0], 4:[6,7,0,7,0]})

对应的表格展示:

1234
02566
146127
20000
30037
423400

你的校验规则可以拆解成两个核心逻辑:

  • 若列1或列2存在非零元素,则列3或列4至少有一个非零元素
  • 若列1和列2全为0,则列3和列4也必须全为0

下面直接给出两种可行的实现方案:

方案一:自定义逐行判断函数

这种写法逻辑清晰,容易理解和修改:

# 定义逐行校验的函数
def check_row_validity(row):
    # 判断列1/2是否有非零值
    col1_col2_has_nonzero = (row[1] != 0) or (row[2] != 0)
    # 判断列3/4是否有非零值
    col3_col4_has_nonzero = (row[3] != 0) or (row[4] != 0)
    # 判断列1/2是否全为0
    col1_col2_all_zero = (row[1] == 0) and (row[2] == 0)
    # 判断列3/4是否全为0
    col3_col4_all_zero = (row[3] == 0) and (row[4] == 0)
    
    # 满足规则的两种情况:要么(列1/2非零且列3/4非零),要么(列1/2全零且列3/4全零)
    return (col1_col2_has_nonzero and col3_col4_has_nonzero) or (col1_col2_all_zero and col3_col4_all_zero)

# 应用函数到每一行,结合行索引生成结果列表
result = list(enumerate(df.apply(check_row_validity, axis=1)))
print(result)

运行后就能得到你期望的结果:
[(0, True), (1, True), (2, True), (3, False), (4, False)]

方案二:向量化运算(更高效)

如果你的DataFrame行数很多,推荐用Pandas的向量化运算,效率比apply更高:

result = list(enumerate(
    # 第一种合法情况:列1/2非零 且 列3/4非零
    ((df[1] != 0) | (df[2] != 0)) & ((df[3] != 0) | (df[4] != 0)) 
    | 
    # 第二种合法情况:列1/2全零 且 列3/4全零
    ((df[1] == 0) & (df[2] == 0)) & ((df[3] == 0) & (df[4] == 0))
))

这段代码用Pandas的布尔数组直接运算,逻辑和方案一完全一致,但执行速度更快。

内容的提问来源于stack exchange,提问作者lena242

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:04:06