You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效分组所有元素相同的等长数组?代码优化问询

高效实现DataFrame中全匹配行的分组

核心思路

既然需求是判断整行30个元素完全一致,完全不需要遍历所有组合计算欧氏距离——直接利用哈希表统计每行的重复频次就能实现O(n)时间复杂度的分组,比原O(n²)的方法效率提升几个量级。

实现步骤

  1. 将每行转为可哈希的元组:Pandas的value_counts和map需要可哈希类型作为键,元组刚好满足需求。
  2. 统计每行的出现频次:快速定位重复行和唯一行。
  3. 映射分组标签:重复行归入同一组,唯一行标记为“无匹配”。

完整代码示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 20:22:44