python - 熊猫`hash_pandas_object`不会为重复的整体产生重复的哈希值
问题描述
我有两个数据框,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
保持相同的大小;也就是说,没有一个哈希值匹配。但是,当我使用一个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
?
解决方案
不同之处在于,在第一种情况下,您正在对完整的数据帧进行散列,而在第二种情况下,您正在对每一行进行散列。
如果您的目标是删除重复的行,您可以使用左/右合并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
推荐阅读
- sql - 获取月份第一个日期的值
- c - 释放后使用 ASAN 堆
- javascript - 使用 React Router 4 保护一组路由
- javascript - 如何以有效的方式在 JavaScript 中进行一些数组比较
- url - 登录后 Keycloak 删除 url 片段
- python - Grouby函数获取列的字符串
- python - Python - 如何打开 n 个不同的 json 文件并追加。一次
- java - 春季配置@RefreshScope
- swift - 我的 ViewController 中的侦听器到我的自定义 Cocoapod 类 - Swift
- javascript - NG-ZORRO 滑块 Angular 7