如何将DataFrame自连接并保留按字母序排列的唯一配对
解决DataFrame自连接生成唯一字母顺序配对的问题
你可以通过两种简洁的方式实现需求,核心思路是生成所有可能的配对后过滤出符合字母顺序的组合,或者直接生成不重复的有序组合:
方法一:利用笛卡尔积+条件过滤
先通过cross连接生成所有可能的配对,再筛选出Item_x字母顺序小于Item_y的行,自动排除自配对和反向重复配对:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({'Items': ['Apple', 'Ball', 'Bar', 'Cat']}) # 生成笛卡尔积形式的全配对 cross_df = pd.merge(df, df, how='cross', suffixes=('_x', '_y')) # 过滤符合要求的配对 result = cross_df[cross_df['Items_x'] < cross_df['Items_y']]
输出结果:
Items_x Items_y 0 Apple Ball 1 Apple Bar 2 Apple Cat 3 Ball Bar 4 Ball Cat 5 Bar Cat
方法二:使用itertools.combinations直接生成有序组合
因为原DataFrame的Items列已经按字母排序,combinations会生成所有不重复的2元素有序组合,正好符合你的需求:
import pandas as pd from itertools import combinations df = pd.DataFrame({'Items': ['Apple', 'Ball', 'Bar', 'Cat']}) # 生成所有2元素的不重复有序组合 pairs = list(combinations(df['Items'], 2)) # 转换为DataFrame result = pd.DataFrame(pairs, columns=['Items_x', 'Items_y'])
这个方法无需额外过滤,效率更高,结果和方法一完全一致。
内容的提问来源于stack exchange,提问作者Stacker
相关产品推荐
相关产品推荐

