如何在Pandas DataFrame中实现行与所有其他行配对并生成新列?
Pandas实现每行与其他所有行配对的方法
需求说明
给定如下DataFrame:
import pandas as pd df = pd.DataFrame({'id': [1, 2, 3, 4, 5, 6], 'name': ['steve', 'joey', 'nikolaj', 'buddy', 'chester', 'mateo']})
需要生成新的DataFrame,其中每一行与除自身外的所有行逐一配对,包含原行的id、name,以及配对行的second_id、second_name(包含反向配对,比如steve和joey、joey和steve都会保留)。
解决方案一:Pandas原生交叉连接(高效适合大数据)
通过添加临时列实现交叉连接,再过滤掉自身配对的行:
# 添加临时列用于交叉连接 df['dummy'] = 1 # 交叉连接自身,用后缀区分原列和配对列 cross_df = pd.merge(df, df, on='dummy', suffixes=('', '_second')) # 过滤掉自身配对(id相同的行),保留需要的列 result = cross_df[cross_df['id'] != cross_df['id_second']][['id', 'name', 'name_second', 'id_second']] # 重命名列名匹配需求 result = result.rename(columns={'name_second': 'second_name', 'id_second': 'second_id'}) # 按id和second_id排序(可选) result = result.sort_values(['id', 'second_id']).reset_index(drop=True)
执行后得到的result片段如下:
id name second_name second_id 0 1 steve joey 2 1 1 steve nikolaj 3 2 1 steve buddy 4 3 1 steve chester 5 4 1 steve mateo 6 5 2 joey steve 1 6 2 joey nikolaj 3 ...
解决方案二:用itertools生成配对(逻辑直观适合小数据)
通过迭代器生成所有行对,再转换为DataFrame:
from itertools import product # 生成所有行对,排除自身配对的情况 pairs = [(row1, row2) for row1, row2 in product(df.itertuples(index=False), repeat=2) if row1.id != row2.id] # 转换为目标格式的DataFrame result = pd.DataFrame([ {'id': p[0].id, 'name': p[0].name, 'second_name': p[1].name, 'second_id': p[1].id} for p in pairs ])
内容的提问来源于stack exchange,提问作者kanataki
相关产品推荐
相关产品推荐

