对称对(Symmetric Pairs)指的是在数据集中,如果存在(A,B)和(B,A)这对记录,那么它们就构成一个对称对。在DataFrame中查找对称对是一个常见的数据处理任务,特别是在处理关系型数据或图数据时。
import pandas as pd
def find_symmetric_pairs(df, col1, col2):
"""
查找DataFrame中的对称对
参数:
df: pandas DataFrame
col1: 第一列列名
col2: 第二列列名
返回:
包含所有对称对的DataFrame
"""
# 创建交换列的副本
swapped = df.rename(columns={col1: col2, col2: col1})
# 合并原始和交换后的DataFrame
merged = pd.merge(df, swapped, on=[col1, col2], how='inner')
# 移除重复的对(如(A,A)只出现一次)
symmetric_pairs = merged.drop_duplicates()
# 过滤掉A==B的情况(如果需要)
symmetric_pairs = symmetric_pairs[symmetric_pairs[col1] != symmetric_pairs[col2]]
return symmetric_pairs
def find_symmetric_pairs_fast(df, col1, col2):
"""
更高效的对称对查找方法
参数:
df: pandas DataFrame
col1: 第一列列名
col2: 第二列列名
返回:
包含所有对称对的DataFrame
"""
# 将数据转换为元组集合
pairs = set(zip(df[col1], df[col2]))
# 使用集合操作查找对称对
symmetric = {(a, b) for (a, b) in pairs if (b, a) in pairs and a < b}
# 转换为DataFrame
return pd.DataFrame(list(symmetric), columns=[col1, col2])
# 示例数据
data = {'A': [1, 2, 3, 4, 5, 2, 1],
'B': [2, 1, 4, 3, 5, 3, 2]}
df = pd.DataFrame(data)
# 查找对称对
result = find_symmetric_pairs(df, 'A', 'B')
print("对称对:")
print(result)
# 更高效的方法
result_fast = find_symmetric_pairs_fast(df, 'A', 'B')
print("\n高效方法找到的对称对:")
print(result_fast)
问题1: 如何处理(A,A)这样的自对称对?
问题2: 如何避免重复报告对称对(如既报告(A,B)又报告(B,A))?
a < b
条件,或在合并后去重问题3: 大数据集下性能差怎么办?
问题4: 如何扩展处理多列的情况?