【问题标题】:For Loop with If Conditions to Return Non-NA Values带有 If 条件的 For 循环以返回非 NA 值
【发布时间】:2021-09-10 22:59:05
【问题描述】:

我正在尝试使用 if 语句执行简单的 for 循环以获取非 NA 值,但是收到错误。你能帮忙吗?

df = pd.DataFrame({'Platform ID' : [1,2,3,4], "Delivery Date" : [str(2009), float("nan"), float("nan"), float("nan")],
                                              "Build Year" : [float("nan"),str(2009),float("nan"), float("nan")], 
                                              "In Service Date" : [float("nan"),float("nan"), str("14-11-2009"), float("nan")]})
df.dtypes
df

def delivery_year(delivery_year, build_year, service_year):
    out = []
    for i in range(0,len(delivery_year)):
        if any(delivery_year.notna()):
            out[i].append(delivery_year)
        if any(delivery_year[i].isna() and build_year[i].notna()):
            out[i].append(build_year)
        elif any(build_year[i].isna()):
            out[i].append(service_year.str.strip().str[-4:])
        else:
            out[i].append(float("nan"))
    return out

df["Delivery Year"] = delivery_year(df["Delivery Date"], df["Build Year"], df["In Service Date"])

错误信息:

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

【问题讨论】:

  • 你能分享你的错误信息吗? :)
  • ValueError: Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
  • @JaroslavKotrba 逻辑和预期输出是什么?
  • 我想获得一个新列,其中包含 Delivery Year,它由这些列组成,但是,有很多 Nans,所以逻辑是 for 循环遍历列并返回第一个非钠值。最好的情况是交付日期,如果不存在,则构建年份,如果甚至不存在,那么至少在机器投入使用时的服务日期。

标签: python pandas


【解决方案1】:

我的猜测是使用np.where() 声明:

import numpy as np

df["Delivery Year"] = np.where(df['Delivery Date'].notna(),df['Delivery Date'],np.where(df['Build Year'].notna(),df['Build Year'],np.where(df['In Service Date'].notna(),df['In Service Date'].str.strip().str[-4:],float("nan"))))

这样,你在反面,当它不为空时,取它,否则切换到另一个解决方案

np.where( IF, THEN, ELSE )

【讨论】:

  • 感谢您的回答 :) 但是,我想要一个带有 ifs 语句的 for 循环!
  • For 循环真的很耗时,而且在您的示例中根本没有用。
  • 我的意思是,我喜欢你的例子,但是,我稍后会针对不同的场景修改 for 循环:)
  • 由于某种原因它不适用于更大的数据集:(
  • 如果不提供错误信息就帮不了你
猜你喜欢
  • 1970-01-01
  • 2015-08-24
  • 2018-03-07
  • 1970-01-01
  • 2023-03-15
  • 2022-11-26
  • 2012-06-04
  • 1970-01-01
  • 2018-07-08
相关资源
最近更新 更多