@maieve

Как удалить похожие строки из таблицы в Pandas, Python?

Есть Excel табличка на много тысяч строк с 1 столбцом, которая содержит URL'ы. Примерный формат:
A
1 http://123.ru/
2 http://lalala.ru/
3 http://lalala.ru/qwe
4 http://lalala.ru/12rwesf
5 http://bebe.ru/
...
15000 http://lololo.ru/


Моя задача: удалить из excel все строки, которые не являются уникальными доменами, то есть, если из примера у нас идут строки 2, 3, 4, то нам надо удалить строки 3 и 4, так как они содержат строку 2, 2 строка останется в таблице.
Пустые строки потом удалю сам в эксельке

Как я это вижу: с использование Pandas проходимся по каждой строке и проверяем, содержится ли она во всех остальных строках. Если содержится - то все остальные удаляем, изначальную оставляем.
  • Вопрос задан
  • 200 просмотров
Пригласить эксперта
Ответы на вопрос 1
Maksim_64
@Maksim_64
Data Analyst
Ну смотрите первое мы имеем str акссесор который позволяет нам осуществить для каждой ячейки как будто она строка в python. Там огромное количество методов и можно даже сложный regex написать если нужно, и на основании его оставить только нужные строки. Второе у pandas есть метод drop_duplicates(), он удаляет все не уникальные строки для одной колонки или даже для комбинации. По желанию можно задать ему параметры и оставить только первое пявление из неуникальных значений или последнее.

Способов для решение вашей задачи на самом деле много. Ну вот парочку на основании той информации что
вами представлена. То есть для представленного вами примера они сработают. Если же это не сработает для всех строк я то не знаю их всех и ориентируюсь на то что представленно вами, то суть, как решать на изменится просто возможно нужно будет добавить какое то условие или какой нибудь regex. Но суть решения не изменится.

df = pd.DataFrame({
    'urls':['123.ru','lalala.ru','lalala.ru/qwe','lalala.ru/12rwse','bebe.ru'],
    'other data':[1,1,1,1,1]
})
# Первый способ 
new_df = df.loc[df['urls'].str.split('/').str[0].drop_duplicates().index]
print(new_df)
# Второй способ
new_df = df[~df['urls'].str.contains('/')].drop_duplicates()
print(new_df)


Первый способ более общий мы разделяем по слешу берем первый элемент (домен), и избавляемся от всех повторяющихся строк. (Более надежно)

Второй способ совсем слабая проверка мы выбираем те строки которые не содержат слеша, предполагая что первый раз (домен) встречается без слеша. (НЕ надежно)

Если же оба примера не покрывают всех случаев (ЧТО скорее всего) то по этому же принципу нужно писать более сложное условие, и все.

Ну вот автор уже и вопрос подредактировал что делает второй способ решения не рабочим да и первый надо менять тоже.
df = pd.DataFrame({
    'urls':['http://123.ru/','http://lalala.ru','http://lalala.ru/qwe',
            'http://lalala.ru/12rwse','http://bebe.ru'],
    'other data':[1,1,1,1,1]
})
new_df = df.loc[df['urls'].str.split('//').str[1].str.split('/').str[0].drop_duplicates().index]
print(new_df)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы