Pandas `hash_pandas_object` 没有为重复的条目生成重复的哈希值

Pandas `hash_pandas_object` not producing duplicate hash values for duplicate entires

我有两个数据帧,df1df2,我知道 df2df1 的子集。我想要做的是找到 df1df2 之间的集合差异,这样 df1 中只有与 df2 中的条目不同的条目。为此,我首先在每个数据帧上使用 pandas.util.hash_pandas_object,然后找到两个散列列之间的集合差异。

df1['hash'] = pd.util.hash_pandas_object(df1, index=False)
df2['hash'] = pd.util.hash_pandas_object(df2, index=False)
df1 = df1.loc[~df1['hash'].isin(df2['hash'])]

这导致 df1 保持相同大小;也就是说,none 个哈希值匹配。但是,当我使用 lambda 函数时,df1 减少了预期的数量。

df1['hash'] = df1.apply(lambda x: hash(tuple(x)), axis=1)
df2['hash'] = df2.apply(lambda x: hash(tuple(x)), axis=1)
df1 = df1.loc[~df1['hash'].isin(df2['hash'])]

第二种方法的问题是执行时间非常长(df1 大约有 300 万行)。我只是误解了如何使用 pandas.util.hash_pandas_object 吗?

不同之处在于,在第一种情况下,您对整个数据帧进行哈希处理,而在第二种情况下,您对每一行进行哈希处理。

如果您的目标是删除重复的行,您可以使用 left/right 合并 indicator 选项更快地实现这一点,然后删除对原始数据框不唯一的行。

df_merged = df1.merge(df2, how='left', on=list_columns, indicator=True)
df_merged = df_merged[df_merged.indicator=="left_only"] # this will keep only unmatched rows