【问题标题】:Pandas vectorization: The truth value of a Series is ambiguousPandas 向量化:Series 的真值不明确
【发布时间】:2021-07-09 21:37:15
【问题描述】:

我目前正在尝试使用 Pandas 应用矢量化的概念。我已经成功地能够使用粗循环,但是在相同的代码上,当我尝试矢量化并将整个系列传递给我得到的函数时

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我的功能比较简单:

def price_function(x):
    if x >= 50:
        return "High"
    else:
        return "low"

我用 price 系列的 Dataframe 调用它,具有以下内容:

listing_price = price_function(listings_dataframe_big['price'])

并且错误是由以下行触发的:

if x >= 50:

知道为什么会发生这种情况以及如何解决这个问题吗?

【问题讨论】:

  • 由于一个系列有多个值,因此评估 s > 50 是不明确的,因为该系列的一部分可能是 True,而其他部分可能是 False。是否要检查是否所有值都大于 50 或单个值是否大于 50。请使用 allany
  • 你可以np.where(listings_dataframe_big['price'] >=50, 'high', 'low')。速度超级快
  • 请注意 applymap 不是矢量化。 np.where 被矢量化了。

标签: python pandas


【解决方案1】:

请注意,apply()map() 不是矢量化,只是变相的循环。

np.where() 被矢量化,因此 generally the fastest method:

listing_price = np.where(listings_dataframe_big['price'] >= 50, 'High', 'Low')

但正如 Scott 提到的,最初的问题是当 x 是一个系列时,x >= 50 是模棱两可的,因为 pandas 不知道你是想要 (x >= 50).any() 还是 (x >= 50).all()

【讨论】:

    【解决方案2】:

    将函数应用于系列的所有值的方法是使用map

    listing_price = listings_dataframe_big['price'].map(price_function)
    

    但如前所述,np.were 更简单,而且很可能更快。

    【讨论】:

      猜你喜欢
      • 2017-03-27
      • 2022-12-12
      • 1970-01-01
      • 2023-01-08
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 2020-10-15
      • 1970-01-01
      相关资源
      最近更新 更多