Pandas `hash_pandas_object` 没有为重复的条目生成重复的哈希值
Pandas `hash_pandas_object` not producing duplicate hash values for duplicate entires
我有两个数据帧,df1
和 df2
,我知道 df2
是 df1
的子集。我想要做的是找到 df1
和 df2
之间的集合差异,这样 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
我有两个数据帧,df1
和 df2
,我知道 df2
是 df1
的子集。我想要做的是找到 df1
和 df2
之间的集合差异,这样 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