如何仅对DataFrame行值哈希,消除列名差异的影响?
解决方案
要实现仅基于行值生成哈希、完全排除列名影响的需求,你可以直接提取每行的原始值集合进行哈希,避开对列名相关属性的依赖。以下是几种可靠的实现方式:
方法1:使用apply提取行值
直接通过row.values获取行的原始值数组,转成元组后计算哈希:
df['hash'] = df_to_hash.apply(lambda row: hash(tuple(row.values)), axis=1)
方法2:用itertuples提升效率
iterrows和apply在处理大数据量时性能较差,itertuples返回命名元组,跳过索引后直接取行值计算哈希:
df['hash'] = pd.Series(hash(tuple(row[1:])) for row in df_to_hash.itertuples())
方法3:转numpy数组批量处理
将DataFrame转为二维numpy数组,遍历每行生成哈希,是性能最优的方式:
df['hash'] = [hash(tuple(row)) for row in df_to_hash.to_numpy()]
扩展:不考虑列顺序的情况
如果需要忽略列的顺序(只要行内值的集合相同就生成相同哈希),可以先对行值排序再计算:
df['hash'] = df_to_hash.apply(lambda row: hash(tuple(sorted(row.values))), axis=1)
验证效果
针对你给出的DF1和DF2示例,使用上述任意一种方法后,两行的哈希值都会分别一致——完全不受Name/FirstName这类列名差异的影响。
内容的提问来源于stack exchange,提问作者nimgwfc
相关产品推荐
相关产品推荐

