You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:45:40