Удалите строки с одинаковым порядком в значении столбца, полученном из декартового произведения / перекрестного соединения. Если значение строки - AB, а другое значение - BA. Мне нужен только AB - PullRequest
0 голосов
/ 06 ноября 2019

как удалить строки с одинаковым порядком в значении столбца, полученном из декартового произведения / перекрестного соединения. Например, если строка со значением столбца AB, а другая строка BA. Мне нужно иметь только 1 ряд AB. Обратите внимание, что я делаю это для огромного набора данных, полученного из продукта cartseian. Следовательно, время обработки и использования памяти является ключевым (у меня только 8 ГБ оперативной памяти) - число строк составляет 10 миллионов строк на 2000 столбцов? Например, см. Изображение ниже.

enter image description here

Желаемый результат:

enter image description here

1 Ответ

0 голосов
/ 06 ноября 2019

Я могу придумать два способа.

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

Метод 2 : сначала создайте продукт пользователей без дубликатов и проверьте с помощью 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
...