Pandas计算两列交集触发TypeError: 'float' object is not iterable
报错根因
- 直接触发点:
Topic1_assignment、Topic2_assignment两列存在缺失值,Pandas默认用float类型的np.nan标记缺失值,列表推导遍历行时,float类型的np.nan被传入set()构造函数。set()仅接受可迭代对象入参,float值不可迭代,直接抛出TypeError。 - 隐藏问题:就算处理完缺失值,如果两列存的是字符串格式的列表内容(比如
"[1,3,5]"这类文本),直接传入set()会把字符串逐字符拆成集合元素,算出来的交集长度完全错误。
修正方案
先做列预处理:补全缺失值,把字符串格式的序列结构转成真实的Python集合,再计算交集长度。
import pandas as pd import ast def parse_col(val): # 缺失值返回空集合 if pd.isna(val): return set() # 字符串格式的列表/元组先转成原生Python结构,再转集合 if isinstance(val, str): return set(ast.literal_eval(val)) # 原生可迭代结构直接转集合 return set(val) df9['C'] = df9.apply( lambda x: len(parse_col(x.Topic1_assignment) & parse_col(x.Topic2_assignment)), axis=1 )
如果确认两列存储的都是原生列表/元组,没有字符串格式的内容,可以简化写法,只做空值兼容即可:
import pandas as pd df9['C'] = [ len(set([] if pd.isna(a) else a) & set([] if pd.isna(b) else b)) for a, b in zip(df9.Topic1_assignment, df9.Topic2_assignment) ]
内容的提问来源于stack exchange,提问作者Noob Coder
相关产品推荐
相关产品推荐

