排查求含NaN的Int64Index列表交集时的ValueError报错原因
ValueError Traceback (most recent call last)
----> 1 df9['c'] = [len(set(a).intersection(b)) if all(pd.notna([a, b])) else 0
2 for a, b in zip(df9.Topic1_assignment, df9.Topic2_assignment)]
----> 1 df9['c'] = [len(set(a).intersection(b)) if all(pd.notna([a, b])) else 0
2 for a, b in zip(df9.Topic1_assignment, df9.Topic2_assignment)]
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all().
请问该报错的可能原因是什么? --- ## 报错原因 - **`pd.notna()`的递归检查行为**:当传入的参数是Int64Index对象时,`pd.notna()`不会返回单个布尔值表示该对象是否为NaN,而是会递归检查Index中的每个元素,返回一个与Index长度相同的布尔数组。此时`all(pd.notna([a, b]))`尝试将这个多元素数组当作单个布尔值进行逻辑判断,Python无法解析这种歧义,因此抛出ValueError。 - **判断逻辑偏离需求**:你原本想判断`a`和`b`本身是否为NaN,但`pd.notna()`对非缺失的容器类对象(如Int64Index)会检查内部元素,而非对象本身的缺失状态。 ## 修复方案 要正确判断`a`、`b`本身是否为NaN,直接使用`pd.isna()`分别判断对象即可: ```python df9['c'] = [len(set(a).intersection(b)) if not (pd.isna(a) or pd.isna(b)) else 0 for a, b in zip(df9.Topic1_assignment, df9.Topic2_assignment)]
内容的提问来源于stack exchange,提问作者Noob Coder
相关产品推荐
相关产品推荐

