ValueError: Series 的真值不明确(API NaN 处理)
Posted
技术标签:
【中文标题】ValueError: Series 的真值不明确(API NaN 处理)【英文标题】:ValueError: The truth value of a Series is ambiguous (API NaN handling) 【发布时间】: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().
我不知道如何解决这个问题!
【问题讨论】:
【参考方案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
仅用于缺失值以上是关于ValueError: Series 的真值不明确(API NaN 处理)的主要内容,如果未能解决你的问题,请参考以下文章
将 Pandas 列传递给函数时出现“ValueError:Series 的真值不明确”
ValueError:在将 lambda 与 loc 一起使用时,Series 的真值不明确 [重复]
为啥我会收到 ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()
ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。 & [复制]
OneHotEncoder : ValueError: Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()
If 语句,ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()