DataFrame多列求共同元素时触发TypeError: 'set' type is unordered错误的解决方法问询
解决DataFrame求所有列共同元素时的TypeError问题
看起来你遇到的问题是当DataFrame所有列的元素完全一致时,使用df.agg(set)配合set.intersection会触发TypeError: 'set' type is unordered错误。我来帮你拆解原因并给出解决方案:
问题根源
当你调用df_last1.agg(set)时,pandas默认会对每列执行set函数并返回一个Series,其中每个元素是对应列的集合。但当所有列的集合内容完全相同时,pandas内部在处理这个聚合结果时,会尝试将这些无序的set类型转换为适配Series/DataFrame的有序数据结构,而set本身是无序的,因此触发了这个错误。之前代码能正常运行,是因为列的集合内容存在差异,没有触发pandas的这个类型限制。
解决方案
这里有两种简单有效的解决方法:
方法1:手动遍历列生成集合列表
直接遍历DataFrame的每一列,将每列转换为set后存入列表,再求交集。这种方式完全绕开pandas聚合时的类型限制:
# 生成每列的集合列表 column_sets = [set(df_last1[col]) for col in df_last1.columns] # 计算所有集合的交集 common_elements = set.intersection(*column_sets)
方法2:调整apply的处理方式
如果偏好使用pandas的API,可以通过apply配合tolist()直接获取集合列表,避免pandas对无序类型的内部处理:
# 对每列应用set函数,并转换为列表 column_sets = df_last1.apply(set, axis=0).tolist() # 计算交集 common_elements = set.intersection(*column_sets)
验证效果
针对你提供的DataFrame(每列元素完全一致),两种方法都会返回该列去重后的所有元素(也就是单个列的set,因为所有列的set完全相同,交集就是其本身),完全符合你的需求。
内容的提问来源于stack exchange,提问作者Yantra Logistics
相关产品推荐
相关产品推荐

