如何对DataFrame的非重复ID配对迭代并应用自定义函数
解决方法
步骤1:分组预处理,提取每个ID的唯一names列表
先对原DataFrame按id分组,提取每个ID对应的不重复names列表,避免后续重复处理相同值:
import pandas as pd data = {'id':[1, 2, 2, 2, 3, 3, 4, 4, 4, 4,], 'names':['a', 'b', 'a', 'c', 'e', 'a', 'b', 'd', 'c', 'a']} df = pd.DataFrame(data) # 按id聚合,得到每个id对应的唯一names列表 id_unique_names = df.groupby('id')['names'].apply(lambda x: list(set(x))).reset_index(name='unique_names')
步骤2:生成所有不重复的ID配对
用itertools.combinations生成所有无序的两两ID组合,自动避免[1,2]和[2,1]这类重复配对:
from itertools import combinations # 获取所有唯一ID unique_ids = id_unique_names['id'].tolist() # 生成两两不重复的ID对 id_pairs = list(combinations(unique_ids, 2))
步骤3:合并数据并应用函数处理
将ID配对转成DataFrame,合并每个ID对应的unique_names,再调用你的myfunc生成结果:
# 把ID对转为DataFrame pairs_df = pd.DataFrame(id_pairs, columns=['id_1', 'id_2']) # 合并id_1对应的names列表 pairs_df = pairs_df.merge(id_unique_names, left_on='id_1', right_on='id', how='left').drop('id', axis=1).rename(columns={'unique_names': 'names_1'}) # 合并id_2对应的names列表 pairs_df = pairs_df.merge(id_unique_names, left_on='id_2', right_on='id', how='left').drop('id', axis=1).rename(columns={'unique_names': 'names_2'}) # 定义你的函数 def myfunc(x,y): return list(set(x+y)) # 应用函数得到结果列 pairs_df['res'] = pairs_df.apply(lambda row: myfunc(row['names_1'], row['names_2']), axis=1) # 提取最终需要的列 final_result = pairs_df[['id_1', 'id_2', 'res']] print(final_result)
优化说明
你的myfunc本质是求两个列表的并集,也可以直接用集合操作替代,效率更高:
pairs_df['res'] = pairs_df.apply(lambda row: list(set(row['names_1']) | set(row['names_2'])), axis=1)
内容的提问来源于stack exchange,提问作者Andres
相关产品推荐
相关产品推荐

