如何用Pandas统计存在指定向量组合的item_id数量
解决方案
步骤1:预处理向量集合,提升查询效率
因为要频繁检查向量是否存在,先把df2的vectors列转成集合——集合的成员查询是O(1)复杂度,比直接查DataFrame快得多:
import pandas as pd from itertools import product # 初始化原始数据 df1 = pd.DataFrame({'item_id':['1','1','1','2','2','2','3','3'],'nodes':['a','b','c','d','a','e','f','g']}) df2 = pd.DataFrame({'vectors':[('a','b'),('b','c'),('d','f'),('e','b')]}) # 转换为集合 vector_set = set(df2['vectors'])
步骤2:按item_id分组验证条件
对df1按item_id分组,给每个item生成所有节点的有序笛卡尔积,再检查是否有积存在于向量集合中:
qualified_items = [] for item_id, group in df1.groupby('item_id'): nodes = group['nodes'].tolist() # 生成所有有序笛卡尔积(包含节点自身组合,如(a,a)) all_vectors = product(nodes, nodes) # 只要有一个向量匹配就标记该item符合条件 has_match = any(vec in vector_set for vec in all_vectors) if has_match: qualified_items.append(item_id)
步骤3:统计符合条件的item数量
直接取合格item列表的长度即可得到结果:
count = len(qualified_items) print(f"符合条件的item_id数量:{count}") # 输出结果为1,仅item_id=1符合要求
简化写法(用apply批量处理)
如果想更简洁,可以结合groupby和apply实现一行式分组验证:
def check_item(group): nodes = group['nodes'].tolist() return any(vec in vector_set for vec in product(nodes, nodes)) # 分组验证后求和,得到符合条件的item数量 count = df1.groupby('item_id').apply(check_item).sum() print(f"符合条件的item_id数量:{count}")
补充说明
如果需求要求有序向量不包含节点自身组合(如(a,a)),只需修改判断逻辑:
has_match = any(vec in vector_set for vec in product(nodes, nodes) if vec[0] != vec[1])
内容的提问来源于stack exchange,提问作者ElTitoFranki
相关产品推荐
相关产品推荐

