在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]})
对应的表格展示:
| 1 | 2 | 3 | 4 | |
|---|---|---|---|---|
| 0 | 2 | 5 | 6 | 6 |
| 1 | 4 | 6 | 12 | 7 |
| 2 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 3 | 7 |
| 4 | 2 | 34 | 0 | 0 |
你的校验规则可以拆解成两个核心逻辑:
- 若列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
相关产品推荐
相关产品推荐

