DataFrame逐行计算值交集报numpy.float64不可迭代TypeError
错误原因
核心触发逻辑:你逐行取到的matrix_model1、matrix_model2列的单元格值是单个数值标量(numpy.float64/int类型),不是列表、集合这类可迭代对象。set()构造函数要求传入可迭代对象,直接传入单个数值就会抛出TypeError: 'numpy.float64' object is not iterable错误。
你之前尝试用.astype('Int64')转类型没有效果,是因为转完之后单元格里依然是单个整数标量,没有变成可迭代的多元素序列,问题根源没有解决。
另外你对“交集计算”的逻辑和当前数据结构不匹配:你当前给出的样例数据每行列都是单个数字,不存在“多个元素求交集”的场景,两个单个值的交集只有两种情况:值相等时交集长度为1,值不等时交集长度为0。
修正方案
根据你的实际数据结构选对应方案即可:
方案1:单元格存单个数值(匹配你给出的样例数据结构)
不用写循环,直接用pandas矢量化运算,效率更高:
# 逐行判断两列值是否相等,相等记交集长度1,不等记0 df2['Model1_Intersection'] = (df2['matrix_model1'] == df2['matrix_model2']).astype(int)
运行后针对你给出的样例数据,输出结果如下:
| matrix_model1 | matrix_model2 | Model1_Intersection |
|---|---|---|
| 7.0 | 2.0 | 0 |
| 4.0 | 4.0 | 1 |
| 30.0 | 20.0 | 0 |
| 4.0 | 8.0 | 0 |
方案2:单元格存列表/集合类多元素序列
如果你的实际数据中,每个单元格存的是多个值组成的列表/集合(比如某行matrix_model1值为[2,4,7],matrix_model2值为[4,8,9]),需要先确认单元格值为可迭代类型,再用修正后的循环计算:
m = [] for i in range(len(df2)): set1 = set(df2['matrix_model1'].iloc[i]) set2 = set(df2['matrix_model2'].iloc[i]) m.append(len(set1 & set2)) df2['Model1_Intersection'] = m
内容的提问来源于stack exchange,提问作者Noob Coder
相关产品推荐
相关产品推荐

