Pandas遍历DataFrame单元格修改非空值处理缺失值报错解决
报错原因拆解
- 第一个
ValueError报错:df.isnull().any(axis=1)返回的是所有行的布尔值序列,无法直接在单个行的if判断中作为布尔值使用,逻辑上你本来想判断当前行x的第12列是否为空,实际写的是判断整个df所有行是否存在空值,完全不匹配需求。 - 后续两次的
TypeError报错:缺失值NaN在pandas中默认是float类型,你没有先判断单元格是否为空,直接执行matches[0] in 单元格值的操作,当单元格是NaN(float类型)时,in操作符无法对float做遍历判断,就会抛出该错误。第三次代码里的pd.notnull(x)是判断行索引x是否为空,完全没有判断目标单元格的值,所以错误没有解决。
修复后的遍历写法
如果要保留遍历的写法,调整判断顺序,先做非空和类型判断,再做匹配判断:
import pandas as pd matches = ['some string1', 'some string2'] for x in range(len(df.index)): current_cell = df.iloc[x, 12] # 先判断非空,再判断是字符串类型,最后判断是否包含目标字符串 if pd.notna(current_cell) and isinstance(current_cell, str) and matches[0] in current_cell: df.iloc[x, 12] = "Something"
更推荐的向量化写法(效率更高,无需遍历)
pandas原生的向量化操作比逐行遍历性能高很多,尤其是数据量较大时优先使用:
import pandas as pd matches = ['some string1', 'some string2'] col_12 = df.columns[12] # 构造匹配条件:非空、包含matches[0] mask = df[col_12].astype(str).str.contains(matches[0], na=False) # 对匹配到的行直接赋值 df.loc[mask, col_12] = "Something"
这里str.contains的na=False参数会自动将空值对应的判断结果设为False,不需要额外写非空判断,astype(str)避免了非字符串类型值导致的报错。
内容的提问来源于stack exchange,提问作者shima
相关产品推荐
相关产品推荐

