如何高效判断Pandas序列中扁平列表的元素唯一性(替代apply逐行迭代)
问题描述
我的DataFrame某一列存储着扁平列表,需要生成新列element_unique:当列表无重复元素时返回1,存在重复元素时返回0。目前我通过apply逐行迭代实现了需求,想知道有没有无需逐行迭代的更高效实现方式?
输入数据
import pandas as pd df = pd.DataFrame(data={ 'key': ["A", "B", "C", "D"], 'dim': [["3", "1", "2"], [6, 5, 6], ["1"], ["2", "2"]] }) df # key dim # 0 A ['3', '1', '2'] # 1 B [6, 5, 6] # 2 C ['1'] # 3 D ['2', '2']
当前实现代码
def is_list_of_unique_values(list_): if len(list_) == len(set(list_)): return 1 return 0 df.loc[:, "element_unique"] = df["dim"].apply(is_list_of_unique_values) df # key dim element_unique # 0 A ['3', '1', '2'] 1 # 1 B [6, 5, 6] 0 # 2 C ['1'] 1 # 3 D ['2', '2'] 0
高效实现方案
方法1:矢量化字符串方法(最简洁高效)
pandas的str方法支持直接对列表列操作,通过对比列表长度和列表内唯一元素数量生成结果:
df['element_unique'] = (df['dim'].str.nunique() == df['dim'].str.len()).astype(int)
这是完全的矢量化操作,避免了逐行迭代,在大数据量下效率远高于apply。
方法2:explode + 分组统计
通过展开列表后分组统计唯一值数量,再和原列表长度对比:
# 展开列表并分组统计每个key对应的唯一元素数 unique_counts = df.explode('dim').groupby('key')['dim'].nunique() # 获取原列表长度 list_lengths = df['dim'].str.len() # 对比后生成目标列 df['element_unique'] = (unique_counts == list_lengths).astype(int)
方法3:列表推导式(比apply快的逐行实现)
如果偏好纯Python风格的实现,列表推导式的执行效率显著高于apply:
df['element_unique'] = [1 if len(set(x)) == len(x) else 0 for x in df['dim']]
以上三种方法均能得到与原代码一致的输出结果。
内容的提问来源于stack exchange,提问作者Alexandre_K
相关产品推荐
相关产品推荐

