首页 > 解决方案 > Pandas:AttributeError:“float”对象没有属性“isnull”

问题描述

输入df

ID      Date    TAVG  TMAX  TMIN
1   01-01-2020         26    21
2   01-01-2020   15    16    
3   01-01-2020   25    29    18
1   02-01-2020   16          16
2   02-01-2020         26    20
.....

我正在使用的代码

for index, row in df.iterrows():

    if [(row["TMIN"].isnull()) & (row["TAVG"].notnull()) & (row["TMAX"].notnull())]:
        row["TMIN"] = (2 * row["TAVG"]) - row["TMAX"]

    if [(row["TMAX"].isnull()) & (row["TMIN"].notnull()) & (row["TAVG"].notnull())]:
        row["TMAX"] = (2 * row["TAVG"]) - row["TMIN"]

    if [(row["TAVG"].isnull()) & (row["TMIN"].notnull()) & (row["TMAX"].notnull())]:
        row["TAVG"] = (row["TMIN"] + row["TMAX"]) / 2

当我运行它时,我收到以下错误:

    if [(row["TMIN"].isnull()) & (row["TAVG"].notnull()) & (row["TMAX"].notnull())]:                                                                                                                                                                    
AttributeError: 'float' object has no attribute 'isnull'  

如何解决这个问题?任何替代方法可以达到相同的结果?

标签: pythonpandas

解决方案


.isnull().notnull()处理系列/列(甚至数据框。您正在访问一行的元素,即单个元素(恰好是一个浮点数)。这会导致错误。

对于 Pandas 中的很多情况,您不应该单独遍历行:改为按列工作,并跳过循环。

您的特定问题可以按列翻译为:

sel = df['TMIN'].isnull() & df['TAVG'].notnull() & df['TMAX'].notnull()
df.loc[sel, 'TMIN'] = df.loc[sel, 'TAVG'] * 2 - df.loc[sel, 'TMAX']

其他两列类似。所有这些都没有任何iterrows()或其他循环。

但是,由于您显然是在尝试用其他列中的值替换 NaNs/null 值,因此您可以.fillna()在此处使用:

df['TMIN'].fillna(df['TAVG'] * 2 - df['TMAX'], inplace=True)

或者如果您不喜欢inplace(因为您不想更改原始数据框,或者想直接在链计算中使用结果):

df['tmin2'] = df['TMIN'].fillna(df['TAVG'] * 2 - df['TMAX'])

对于其他两列:

df['tmax2'] = 2 * df['TAVG'] - df['TMIN']
df['tavg2'] = (df['TAVG'] + df['TMIN'])/2

您可能会问,TMIN 单元格中发生的情况为空,TAVG 或 TMAX 值或两者都为空。在这种情况下,您将用 null 替换 null 值,因此没有任何反应。鉴于您的原始if陈述,您的原始代码也是如此。


推荐阅读