从笛卡尔积/交叉 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
如何删除从笛卡尔积/交叉连接获得的列值中具有相同顺序的行。例如,如果具有列值的行是 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