首页 > 解决方案 > 熊猫`hash_pandas_object`不会为重复的整体产生重复的哈希值

问题描述

我有两个数据框,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保持相同的大小;也就是说,没有一个哈希值匹配。但是,当我使用一个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

标签: pythonpandasdataframehash

解决方案


不同之处在于,在第一种情况下,您正在对完整的数据帧进行散列,而在第二种情况下,您正在对每一行进行散列。

如果您的目标是删除重复的行,您可以使用左/右合并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

推荐阅读