如何在Python DataFrame中查找列间共同值并生成新DataFrame
解决方法
首先还原你的原始DataFrame:
import pandas as pd df = pd.DataFrame({ 'A': [1, 1, 1, 2, 2, 4, 5, 5], 'B': [2, 3, 4, 3, 5, 2, 3, 4] }, index=[1,2,3,4,5,6,7,8])
步骤1:构建值的双向关联字典
先整理每个值的所有关联对象(不管是在A列还是B列),因为关联是双向的:
from collections import defaultdict # 用集合存储每个值的关联对象,自动去重 relation = defaultdict(set) # 遍历每行,双向添加关联关系 for _, row in df.iterrows(): a, b = row['A'], row['B'] relation[a].add(b) relation[b].add(a)
生成的关联字典内容为:
{1: {2, 3, 4}, 2: {1, 3, 5, 4}, 3: {1, 2, 5}, 4: {1, 2, 5}, 5: {2, 3, 4}}
步骤2:提取配对的共同关联值并生成结果
从原始数据中提取去重的A-B配对,然后找出每个配对的共同第三方关联值,生成目标结构:
# 获取原始数据中去重的A-B配对 unique_pairs = df[['A', 'B']].drop_duplicates().values.tolist() result_rows = [] for x, y in unique_pairs: # 计算两个值的共同关联值 common_values = relation[x] & relation[y] # 排除值本身,只保留第三方共同值 common_values = common_values - {x, y} # 为每个共同值生成一行结果 for val in common_values: result_rows.append({'A': x, 'B': y, 'C': val}) # 转换为DataFrame并调整索引 result_df = pd.DataFrame(result_rows).reset_index(drop=True) result_df.index = result_df.index + 1
最终得到的result_df就是你需要的结构:
A B C 1 1 2 3 2 1 2 4 3 2 3 5
补充说明
- 如果需要处理特定配对而非全部,可直接替换
unique_pairs为指定列表,比如unique_pairs = [(1,2), (2,3)] - 原始数据中其他配对(如(4,2))也会被自动处理,生成对应的共同关联值行
内容的提问来源于stack exchange,提问作者schizetia
相关产品推荐
相关产品推荐

