如何高效分组所有元素相同的等长数组?代码优化问询
高效实现DataFrame中全匹配行的分组
核心思路
既然需求是判断整行30个元素完全一致,完全不需要遍历所有组合计算欧氏距离——直接利用哈希表统计每行的重复频次就能实现O(n)时间复杂度的分组,比原O(n²)的方法效率提升几个量级。
实现步骤
- 将每行转为可哈希的元组:Pandas的
value_counts和map需要可哈希类型作为键,元组刚好满足需求。 - 统计每行的出现频次:快速定位重复行和唯一行。
- 映射分组标签:重复行归入同一组,唯一行标记为“无匹配”。
完整代码示例
import pandas as pd # 1. 给每行生成唯一标识(元组) df['row_key'] = df.apply(tuple, axis=1) # 2. 统计每行的出现次数 row_counts = df['row_key'].value_counts() # 3. 生成分组映射:重复行用自定义组名,唯一行归为“无匹配” # 先给重复行分配组名(比如按出现顺序命名为“组1”“组2”...) duplicate_keys = row_counts[row_counts >= 2].index group_name_map = {key: f'组{i+1}' for i, key in enumerate(duplicate_keys)} # 补充唯一行的映射 group_name_map.update({key: '无匹配' for key in row_counts[row_counts == 1].index}) # 4. 给DataFrame添加分组列 df['分组'] = df['row_key'].map(group_name_map) # 可选:删除临时的row_key列 df.drop('row_key', axis=1, inplace=True)
为什么这方法更快?
- 原方法遍历所有行组合,时间复杂度是O(n²),当数据量超过几百行时会急剧变慢;
- 新方法全程是线性时间操作:
apply转元组是O(n*30),value_counts和map都是O(n),整体复杂度O(n),数据量越大,效率提升越明显。
验证逻辑一致性
你原本用sum(np.array(df.iloc[0,:]) == np.array(df.iloc[1,:])) == 30判断全匹配,转元组后直接比较元组是否相等,和这个逻辑完全等价——因为元组会逐元素对比,只有所有元素完全一致时才视为相等。
内容的提问来源于stack exchange,提问作者Jordi van Selm
相关产品推荐
相关产品推荐

