python - 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'
如何解决这个问题?任何替代方法可以达到相同的结果?
解决方案
.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
陈述,您的原始代码也是如此。
推荐阅读
- java - Spring Boot Web RestTemplate 发送对象作为查询参数
- php - 除了循环中的 strrev 之外,还有更快的方法来镜像 PHP 中的多行文本吗?
- java - 无法获得充电状态
- python - 如何在不混乱接口的情况下共享对象的单个实例?
- ruby-on-rails - postgresql 数据库密码
- dart - 如何让构造函数使用与 super 相同的默认值?
- sql - 添加基于计数器的连续日期
- dialogflow-es - 如何使用参数在 Google Dialogflow 中修改上下文
- java - 无法使用 Junit5 运行 Pit Ideaa 插件
- security - 如何为本地客户端使用安全的 WebSocket 连接