Python中如何去除两个Pandas DataFrame的交集行?
解决Pandas求DataFrame非交集行时的"unhashable type: 'numpy.ndarray'"错误
错误原因
drop_duplicates 默认会基于所有列判断重复行,但如果DataFrame中存在包含numpy.ndarray类型元素的列,这类元素不可哈希,就会触发该错误——因为去重操作需要对列元素进行哈希计算来识别重复项。
解决方法
方法1:指定仅用可哈希列判断重复
如果包含numpy数组的列不需要参与重复判断,可以通过subset参数指定用于去重的列(只选不含数组的列):
# 假设仅用col1、col2这两个无数组的列判断重复 o = pd.concat([wildone_df, df1]).drop_duplicates(subset=['col1', 'col2'], keep=False) # 注意:keep=False会保留所有非重复行,也就是两个DataFrame的非交集
方法2:将数组列转为可哈希类型
如果必须用含数组的列判断重复,可将列中的numpy数组转换为可哈希的类型(比如元组):
import numpy as np # 遍历所有列,将含numpy数组的列转为元组 def convert_array_to_tuple(df): for col in df.columns: # 检查列中是否有numpy数组元素 if any(isinstance(x, np.ndarray) for x in df[col]): df[col] = df[col].apply(tuple) return df # 先处理两个DataFrame wildone_df_processed = convert_array_to_tuple(wildone_df.copy()) df1_processed = convert_array_to_tuple(df1.copy()) # 再执行去重求非交集 o = pd.concat([wildone_df_processed, df1_processed]).drop_duplicates(keep=False)
方法3:用Merge方式间接求非交集
通过先找两个DataFrame的交集,再从合并后的结果中剔除交集,也能得到非交集行(同样需要先处理数组列,否则merge也会报错):
import numpy as np # 先处理数组列(同方法2的转换逻辑) def convert_array_to_tuple(df): for col in df.columns: if any(isinstance(x, np.ndarray) for x in df[col]): df[col] = df[col].apply(tuple) return df wildone_df_processed = convert_array_to_tuple(wildone_df.copy()) df1_processed = convert_array_to_tuple(df1.copy()) # 求交集 intersection = pd.merge(wildone_df_processed, df1_processed, how='inner') # 合并两个DataFrame merged = pd.concat([wildone_df_processed, df1_processed]) # 剔除交集得到非交集行 non_intersection = merged[~merged.isin(intersection)].dropna(how='all')
内容的提问来源于stack exchange,提问作者Amir Baniasadi
相关产品推荐
相关产品推荐

