【问题标题】:Assign a variable to none if the resulting dataframe is empty after filtering columns如果在过滤列后生成的数据框为空,则将变量分配给 none
【发布时间】:2022-11-26 15:53:27
【问题描述】:

我正在尝试获取包含空值或整数的 z 列中的值:

df = pd.DataFrame({'X': [1, 2, 3, 4],
                    'Y': [2, 10, 13, 18],
                  'Z': [3, None, 5, None]})

a = df[(df.X == 1) & (df.Y == 2)].Z.item()
print(a)
#output: 3

b = df[(df.X == 7) & (df.Y == 18)].Z.item()
print(b)
#output: error

它抛出一个值错误:只能将大小为 1 的数组转换为 Python 标量。因为过滤 X 和 Y 列产生的数据框是空的。如果数据框为空,我想将变量 b 分配给 None

我尝试了以下方法,并且有效:

#checking the length of the dataframe
b = df[(df.X == 1) & (df.Y == 2)].Z.item() if (len(df[(df.X == 7) & (df.Y == 18)]) == 1) else None
print(b)
# output: None

有更好的方法吗?

【问题讨论】:

    标签: python pandas dataframe filtering


    【解决方案1】:

    一种替代方法是使用 next(..., None),如果迭代器为空,则返回 None:

    b = next(iter(df[(df.X == 7) & (df.Y == 18)].Z), None)
    print(b)
    # None
    

    【讨论】:

      【解决方案2】:

      两件事——你的结果是空的,因此出现错误——.item() 显然会在空的pd.Series 上抛出错误。 其次 - 实现你所追求的更规范的方式是:

      df.loc[(df.X == 7) & (df.Y == 18), "Z"].values
      

      还可以防止错误 .item() 生成。

      【讨论】:

      • 这不会将变量 b 分配给 None 而是分配给一个空数组。
      猜你喜欢
      • 2022-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 2016-11-10
      • 2020-05-18
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多