从笛卡尔积/交叉 join.If 中获得的列值中删除具有相同顺序的行,行值为 AB,其他值为 BA。我只需要AB

Remove rows with same order in a column value obtained from Cartesian product / Cross join.If a row value is AB and other value is BA. I need only AB

如何删除从笛卡尔积/交叉连接获得的列值中具有相同顺序的行。例如,如果具有列值的行是 AB 而其他行是 BA。我只需要 1 排 AB。?请注意,我正在为从 cartseian 产品获得的巨大数据集执行此操作。因此,处理时间和内存使用是关键(我只有 8GB Ram)——行数是 1000 万行乘以 2000 列?例如,见下图。

期望的输出:

我能想到的两种方式。

df = pd.DataFrame({"UserName_x":["A","B","A","C"],
                   "UserName_y":["B","A","C","A"],
                   "edge":["AB","BA","AC","CA"]})

方法 1:按字母顺序对 edge 字符串进行排序 drop_duplicates:

df["sorted"] = df["edge"].apply(lambda x: ''.join(sorted(x)))

print (df.drop_duplicates(subset="sorted"))

#
  UserName_x UserName_y edge sorted
0          A          B   AB     AB
2          A          C   AC     AC

方法二:先创建一个没有重复的用户的产品,用isin:

验证
from itertools import combinations_with_replacement

unique = df["UserName_x"].unique().tolist()
combos = ["".join(i) for i in combinations_with_replacement(unique,2)]

print (df[df["edge"].isin(combos)])

#
  UserName_x UserName_y edge sorted
0          A          B   AB     AB
2          A          C   AC     AC