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
相关产品推荐
相关产品推荐

