You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:02:03