Pandas Edgelist处理:统计两两组合在指定列的共同值数量
实现步骤及代码
首先导入依赖库并构造原始数据表:
import pandas as pd import itertools # 构造原始数据 df = pd.DataFrame({ 'Name': ['Alice', 'Bob', 'Clyde', 'Dave', 'Alice', 'Bob'], 'Pet': ['Dog', 'Dog', 'Horse', 'Dog', 'Cat', 'Cat'] })
接下来获取每个用户对应的宠物集合,方便后续快速计算交集:
# 按用户分组,将每个用户的宠物转为集合存储 user_pet_map = df.groupby('Name')['Pet'].apply(set).to_dict() all_users = user_pet_map.keys()
生成所有不重复的两两用户组合,计算共同宠物数量并格式化输出字段:
result = [] # itertools.combinations 会自动生成无重复的两两组合,不会出现(A,B)和(B,A)重复、以及用户和自己配对的情况 for name1, name2 in itertools.combinations(all_users, 2): common_pets = user_pet_map[name1] & user_pet_map[name2] common_count = len(common_pets) # 按要求格式化Pet字段 if common_count >= 2: pet_desc = f"{common_count}(双方都拥有{'、'.join(common_pets)})" else: pet_desc = str(common_count) result.append({ 'Name1': name1, 'Name2': name2, 'Pet': pet_desc }) # 转为DataFrame查看结果 result_df = pd.DataFrame(result) print(result_df)
输出结果验证
运行代码得到的结果和需求完全匹配:
| Name1 | Name2 | Pet |
|---|---|---|
| Alice | Bob | 2(双方都拥有Dog、Cat) |
| Alice | Clyde | 0 |
| Alice | Dave | 1 |
| Bob | Clyde | 0 |
| Bob | Dave | 1 |
| Clyde | Dave | 0 |
如果需要把宠物名替换为中文,直接在构造原始数据时修改对应值即可。
内容的提问来源于stack exchange,提问作者bobglu
相关产品推荐
相关产品推荐

