如何在Python中仅对数值单元格执行Mod(%4)运算并跳过空单元格
问题描述
如何仅对含数据的单元格执行取模4(%4)运算并跳过空单元格?空单元格无法执行取模运算,因此我希望跳过它们。
原始数据:
0 1 2 3 4 5 6 7 8 9 10 A 23 23 10 54 23 B 34 12 34 54 C 98 76 D 11 12 12 E 14 23
我尝试了以下代码,但当某列存在空单元格时,该列完全不执行任何操作:
for i in split.iloc[:,2:]: if not np.where(split[i]==''): split[i] =split[i].astype(int) split[i]=split[i]%4 else: continue
实际输出:
0 1 2 3 4 5 6 7 8 9 10 A 3 3 10 54 23 B 2 0 34 54 C 2 0 D 3 0 12 E 2 3
期望输出:
0 1 2 3 4 5 6 7 8 9 10 A 3 3 2 2 3 B 2 0 2 2 C 2 0 D 3 0 0 E 2 3
问题分析
原代码的核心错误在于判断逻辑:
np.where(split[i]=='')返回的是空值的索引数组,not np.where(...)的判断逻辑完全错误,只要列里存在空单元格,就会进入else分支跳过整列处理,这就是为什么列4、5等有数据的单元格也没执行取模。- 直接用
==''判断空值并不严谨,pandas中空值通常以NaN形式存在,而非空字符串。
解决方案
可以通过以下几种方式实现仅对非空单元格执行取模4运算:
方法1:使用applymap处理每个单元格
遍历每个单元格,仅当单元格非空时执行取模:
import pandas as pd import numpy as np # 先将空字符串替换为NaN(适配原始数据的空值格式) split = split.replace('', np.nan) # 对第2列及之后的列执行处理 split.iloc[:, 2:] = split.iloc[:, 2:].applymap(lambda x: int(x)%4 if pd.notna(x) else x)
方法2:针对列使用where逻辑
先判断空值,仅对非空值执行取模运算:
cols = split.columns[2:] split[cols] = split[cols].apply(lambda x: x.where(pd.isna(x), x.astype(int)%4))
方法3:修正原循环逻辑
如果坚持用循环,修改判断逻辑为逐个单元格处理:
for col in split.iloc[:, 2:].columns: split[col] = split[col].apply(lambda x: int(x)%4 if x != '' else x)
以上方法都能实现仅对非空单元格执行取模4,同时保留空单元格,得到期望输出。
内容的提问来源于stack exchange,提问作者avinash reddy
相关产品推荐
相关产品推荐

