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

图问题中如何提取DataFrame内存在对称节点对的所有行?

高效提取DataFrame中的对称双向边行

要找出DataFrame中存在对称节点对(即同时有(i,j)和(j,i))的所有行,完全不需要用循环遍历,用pandas的矢量化操作就能高效解决,下面提供两种实用方法:

方法一:排序节点对标记法

核心思路是把每行的两个节点排序后生成统一标识,这样(i,j)和(j,i)会被标记为同一个标识,再通过计数筛选出出现过至少两次的标识,最终提取对应行:

import pandas as pd

# 示例数据
df = pd.DataFrame({
    'Column A': ['value 1', 'value 1', 'value 2', 'value 2'],
    'Column B': ['value 2', 'value 3', 'value 3', 'value 1']
})

# 生成排序后的节点对作为统一键
df['sorted_pair'] = df.apply(lambda row: tuple(sorted([row['Column A'], row['Column B']])), axis=1)

# 筛选出出现次数≥2的节点对
valid_pairs = df['sorted_pair'].value_counts()[lambda x: x >= 2].index

# 提取目标行并删除辅助列
result = df[df['sorted_pair'].isin(valid_pairs)].drop('sorted_pair', axis=1)
print(result)

运行后会得到你需要的两行对称数据,这种方法在大数据量下的效率远高于循环,因为pandas的apply和isin都是优化过的矢量化操作。

方法二:自合并匹配法

通过将DataFrame与自身合并,直接匹配对称的节点对:

import pandas as pd

df = pd.DataFrame({
    'Column A': ['value 1', 'value 1', 'value 2', 'value 2'],
    'Column B': ['value 2', 'value 3', 'value 3', 'value 1']
})

# 自合并,匹配左表(A,B)等于右表(B,A)的行
merged_df = df.merge(df, left_on=['Column A', 'Column B'], right_on=['Column B', 'Column A'], how='inner')

# 提取原行数据(保留所有对称行)
result = merged_df[['Column A_x', 'Column B_x']].rename(columns={'Column A_x':'Column A', 'Column B_x':'Column B'})
print(result)

这种方法直接通过合并逻辑找到所有对称存在的行,适合需要明确匹配关系的场景。

对比你之前的循环方法,这两种方法都避免了O(n²)的遍历,数据量越大,效率提升越明显。

内容的提问来源于stack exchange,提问作者Aya Jamai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:15:34