【问题标题】:ValueError: The truth value of a Series is ambiguous (API NaN handling)ValueError: Series 的真值不明确(API NaN 处理)
【发布时间】:2019-12-19 18:03:05
【问题描述】:

我正在 django-rest-framework 中开发一个 API,根据您的输入参数,您会得到不同的响应。 API 正在计算将根据数据库返回给用户的指标。

我写了一个函数来处理 NaN 值,如下所示:

def nan_to_none(value):
    if not isinstance(value, str) and value is not None and np.isnan(value):
        return None
    return value

这是弹出错误的响应元素:

 "prog": nan_to_none(row["average_items_prog"])

这是引发问题的 SQL 行:

  ((((coalesce(qte_art, 0) / nullif(nb_client, 0)) - (coalesce(qte_art_n1, 0) / nullif(nb_client_n1, 0))) / (coalesce(qte_art_n1, 0) / nullif(nb_client_n1, 0))) * 100) as average_items_prog,

这是错误信息:

  File "C:\Users\wdc\views.py", line 464, in get
    "prog": nan_to_none(row["average_items_prog"])},
  File "C:\Users\wdc\views.py", line 28, in nan_to_none
    if not isinstance(value, str) and value is not None and np.isnan(value):
  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py", line 1478, in __nonzero__
    .format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我不知道如何解决这个问题!

【问题讨论】:

    标签: python pandas dataframe valueerror


    【解决方案1】:

    尝试改变:

    "prog": nan_to_none(row["average_items_prog"])
    

    Series.apply:

    "prog": row["average_items_prog"].apply(nan_to_none)
    

    测试:

    s = pd.Series(['a', 0, 0, 1, None, np.nan])
    print (s)
    0       a
    1       0
    2       0
    3       1
    4    None
    5     NaN
    dtype: object
    
    def nan_to_none(value):
        if not isinstance(value, str) and value is not None and np.isnan(value):
            return None
        return value
    
    print (s.apply(nan_to_none))
    #in your solution
    #"prog": row["average_items_prog"].apply(nan_to_none)
    0       a
    1       0
    2       0
    3       1
    4    None
    5    None
    dtype: object
    

    似乎解决方案应该通过测试来简化np.nan != np.nan

    def nan_to_none(value):
        if value != value:
            return None
        return value
    
    print (s.apply(nan_to_none))
    #in your solution
    #"prog": row["average_items_prog"].apply(nan_to_none)
    0       a
    1       0
    2       0
    3       1
    4    None
    5    None
    dtype: object
    

    或将None 设置为Series.mask

    print (s.mask(s.isna(), None))
    #in your solution
    #"prog": row["average_items_prog"].mask(s.isna(), None)
    0       a
    1       0
    2       0
    3       1
    4    None
    5    None
    dtype: object
    

    【讨论】:

    • 感谢您的详尽回复!你能解释更多关于用 value !=value 改变这个小函数吗?
    • @S.Jackson - 当然,这是来自In [12]: np.nan == np.nan Out[12]: False 的好技巧,因此使用np.nan != np.nan 测试缺失值返回True 仅用于缺失值
    猜你喜欢
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 2023-01-08
    • 2020-03-05
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多