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

如何高效实现DataFrame分组内行的Pairwise Join?

高效实现组内ID后续配对的DataFrame扩展

核心思路

放弃低效的嵌套循环和逐行追加操作,采用两种高效方案实现:要么用itertools.combinations在分组内生成合规行对,要么用DataFrame自连接+筛选,两种方式都能大幅提升处理速度。


方案一:分组+组合生成(直观易读)

import pandas as pd
from itertools import combinations

# 示例数据(实际数据直接替换为你的df即可)
df = pd.DataFrame({
    'Group': ['A', 'A', 'A', 'A', 'B', 'B', 'B'],
    'ID': [1, 2, 3, 4, 1, 2, 3],
    'Loc': ['D1', 'D2', 'D3', 'D4', 'D1', 'D2', 'D3'],
    'Dist': [314, 299, 323, 379, 314, 299, 323]
})

def process_single_group(group):
    # 生成组内所有i<j的行对(保证ID_1对应后续ID_2)
    row_pairs = combinations(group.itertuples(index=False), 2)
    # 转换为目标格式的行字典
    output_rows = []
    for row1, row2 in row_pairs:
        output_rows.append({
            'Group': row1.Group,
            'ID_1': row1.ID, 'Loc_1': row1.Loc, 'Dist_1': row1.Dist,
            'ID_2': row2.ID, 'Loc_2': row2.Loc, 'Dist_2': row2.Dist
        })
    return pd.DataFrame(output_rows)

# 按Group分组处理,拼接所有结果
final_result = df.groupby('Group', group_keys=False).apply(process_single_group).reset_index(drop=True)

方案二:自连接+筛选(全向量化,大数据量更优)

如果你的数据量极大,全向量化的自连接方案效率会更高:

import pandas as pd

# 示例数据
df = pd.DataFrame({
    'Group': ['A', 'A', 'A', 'A', 'B', 'B', 'B'],
    'ID': [1, 2, 3, 4, 1, 2, 3],
    'Loc': ['D1', 'D2', 'D3', 'D4', 'D1', 'D2', 'D3'],
    'Dist': [314, 299, 323, 379, 314, 299, 323]
})

# 为左右表添加后缀区分
df_left = df.add_suffix('_1')
df_right = df.add_suffix('_2')

# 按Group自连接,筛选ID_1 < ID_2的行(保证是后续ID配对)
final_result = pd.merge(df_left, df_right, left_on='Group_1', right_on='Group_2')
final_result = final_result[final_result['ID_1'] < final_result['ID_2']]

# 整理列名和顺序
final_result = final_result.rename(columns={'Group_1': 'Group'})
final_result = final_result.drop(columns=['Group_2'])
final_result = final_result[['Group', 'ID_1', 'Loc_1', 'Dist_1', 'ID_2', 'Loc_2', 'Dist_2']].reset_index(drop=True)

为什么比原方法高效?

  1. 避免逐行追加:原代码中df.loc[len(df_ext)] = l会频繁触发DataFrame内存扩容,时间复杂度极高;两种新方案都是批量生成数据后一次性转换为DataFrame。
  2. 消除嵌套循环:用combinations或自连接替代多层for循环,将O(n²)的低效循环操作转化为底层优化过的向量/批量操作。
  3. 利用pandas原生优化:groupby和merge都是pandas经过C级优化的核心功能,远快于手动筛选分组的逻辑。

内容的提问来源于stack exchange,提问作者Erin Walter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:40:57