Pandas报错AttributeError: 'float' object has no attribute 'isnull'如何解决?
错误原因
- 报错核心是
iterrows()返回的行中单个字段为原生float类型,空值对应NaN,原生float没有isnull()方法,isnull()是pandas复合对象(Series/ DataFrame)的专属方法。 - 额外隐藏问题:直接修改
row对象不会同步更新原DataFrame,因为iterrows()返回的是行数据的拷贝而非视图。
原有循环代码的修复方案
将空值判断替换为pandas通用的空值检测函数pd.isna()/pd.notna(),同时通过df.loc直接修改原DataFrame:
import pandas as pd for index, row in df.iterrows(): # 补全TMIN:TAVG、TMAX非空,TMIN为空时计算填充 if pd.isna(row["TMIN"]) and pd.notna(row["TAVG"]) and pd.notna(row["TMAX"]): df.loc[index, "TMIN"] = 2 * row["TAVG"] - row["TMAX"] # 补全TMAX:TAVG、TMIN非空,TMAX为空时计算填充 if pd.isna(row["TMAX"]) and pd.notna(row["TMIN"]) and pd.notna(row["TAVG"]): df.loc[index, "TMAX"] = 2 * row["TAVG"] - row["TMIN"] # 补全TAVG:TMIN、TMAX非空,TAVG为空时计算填充 if pd.isna(row["TAVG"]) and pd.notna(row["TMIN"]) and pd.notna(row["TMAX"]): df.loc[index, "TAVG"] = (row["TMIN"] + row["TMAX"]) / 2
更高效的向量化替代方案
无需循环,直接使用pandas内置的向量化操作实现相同效果,性能远高于逐行遍历,适合大数据量场景:
import pandas as pd # 优先补全TAVG:TMIN和TMAX都非空时用平均值填充空值 df['TAVG'] = df['TAVG'].fillna((df['TMIN'] + df['TMAX']) / 2) # 补全TMIN:TAVG和TMAX都非空时用公式计算填充空值 df['TMIN'] = df['TMIN'].fillna(2 * df['TAVG'] - df['TMAX']) # 补全TMAX:TAVG和TMIN都非空时用公式计算填充空值 df['TMAX'] = df['TMAX'].fillna(2 * df['TAVG'] - df['TMIN'])
该方案逻辑和原有需求完全一致:只有当另外两个温度值都非空时,才会计算填充空值,其余情况会保留原始空值。
内容的提问来源于stack exchange,提问作者RoshADM
相关产品推荐
相关产品推荐

