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

Pandas对象类型DataFrame行值全唯一的高效判断方法

高效判断对象类型DataFrame每行值是否全唯一的优化方案

需求目标

  • 处理一个30k行×15列的窄长DataFrame df,需判断每行所有值是否全部唯一
  • 重点针对对象类型场景优化(例如pint量这类对象),这类场景运行速度远慢于数值类型,且无法控制输入数据类型(可能是浮点型、整型、pint量或混合类型)

现有方案及问题

最初使用的代码:

df.nunique(axis=1) == len(df.columns)
  • 执行耗时47秒,效率低下:实际不需要统计唯一值的具体数量,但该代码仍完成了全量统计操作

已尝试的优化及结果

编写了提前终止判断的boolunique函数:

def boolunique(row):
    vals = set()
    for val in row:
        if val in vals:
            return False
        vals.add(val)
    return True

不同调用方式的测试结果:

  • 使用df.apply(boolunique, axis=1):耗时81秒,比原方案更慢
  • 使用pd.Series({n: boolunique(r) for n, r in df.iterrows()}):耗时24秒,较原方案提速但仍未达预期
  • 尝试变体lambda row: len(set(row)) == len(row):耗时与上述迭代方式几乎一致

测试数据生成代码

用于模拟对象类型场景的示例代码:

import numpy as np
import pandas as pd
import pint
import pint_pandas

idx = pd.date_range('1940', '2020', freq='D')
vals = np.random.random_integers(0, 40, (len(idx), 15))
df = pd.DataFrame({n: pd.Series(column, idx).astype('pint[sec]') for n, column in enumerate(vals.T)})
  • .astype('pint[sec]')会将数值转为对象类型,复现拖慢运行速度的场景

咨询问题

是否存在被忽略的、更高效的实现方式?


内容的提问来源于stack exchange,提问作者ElRudi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:27:20