Pandas中高效计算两个DataFrame指定列唯一值差异数量的优化方法问询
高效统计df2中独有的col1唯一值数量
这个问题我太有体会了!当数据量上去之后,用列表推导式做成员检查确实会慢到让人抓狂——因为列表的in操作是**O(n)**时间复杂度,数据量大了之后叠加起来的开销简直恐怖。下面给你几个更智能、更高效的实现方案,都是针对大数据量优化的:
方案1:利用集合的差集特性(简单直接)
集合的成员检查是**O(1)**的,比列表快得多,我们可以把两个列的唯一值转成集合后直接求差集:
# 转成集合求差集 unique_df1 = set(df1['col1'].unique()) unique_df2 = set(df2['col1'].unique()) unique_only_in_df2 = unique_df2 - unique_df1 count = len(unique_only_in_df2)
这个方法的优势是逻辑直观,而且集合操作在Python里是经过高度优化的,处理十万甚至百万级别的唯一值都毫无压力。
方案2:用Pandas向量化操作(最推荐)
Pandas的向量化方法是底层用C实现的,速度比Python原生循环快几个数量级,而且代码更简洁:
# 一步到位:筛选+去重计数 count = df2[~df2['col1'].isin(df1['col1'])]['col1'].nunique()
拆解一下逻辑:
df2['col1'].isin(df1['col1']):生成布尔数组,标记df2的col1值是否在df1的col1中存在~:取反,得到df2中不存在于df1的那些行['col1'].nunique():直接统计这些行里col1的唯一值数量
这个方案不需要额外生成中间列表/集合,内存占用也更优,是处理大数据量Pandas场景的首选。
为什么你的原方法慢?
你原来的列表推导式里,每一次x not in list1都要遍历整个list1,如果list1有10万条数据,遍历10万次的开销会非常大。而上面的两种方案都是利用了底层优化的集合操作或向量化操作,把时间复杂度从O(n*m)降到了O(n)级别,速度提升非常明显。
内容的提问来源于stack exchange,提问作者user18334254
相关产品推荐
相关产品推荐

