Форум сайта python.su
0
Всем привет! У меня есть две таблицы dataframe. В каждой есть столбец с email типом object. Но в одной из двух таблиц имеется по несколько электронных почт в одной строке. Задача: Сравнить значение строки или каждое значение из строк в первой таблице со всеми email в другой таблицы и добавить новый столбец, где будет true(если было совпадение) или false(если сопадений нет). Проблема с которой сталкиваюсь состоит еще в том, что в некоторых строках есть значение None, которое упорно не хочет уходить с помощью .fillna()
Тут я сделал df.email.str.split(','), чтобы разбить их через запятую
Это df2 с которым хочу сравнивать email.
Подскажите, пожалуйста, логику как пройтись циклом сначала сначала по столбцу email, если там не пусто сравнить одно или несколько значений и добавить в новый столбец было совпадение или нет.
https://i.stack.imgur.com/Sb0U1.png
Всем привет! У меня есть две таблицы dataframe. В каждой есть столбец с email типом object. Но в одной из двух таблиц имеется по несколько электронных почт в одной строке. Задача: Сравнить значение строки или каждое значение из строк в первой таблице со всеми email в другой таблицы и добавить новый столбец, где будет true(если было совпадение) или false(если сопадений нет). Проблема с которой сталкиваюсь состоит еще в том, что в некоторых строках есть значение None, которое упорно не хочет уходить с помощью .fillna()
Это таблица df Тут я сделал df.email.str.split(','), чтобы разбить их через запятую
Это таблица df2
Подскажите, пожалуйста, логику как пройтись циклом сначала сначала по столбцу email, если там не пусто сравнить одно или несколько значений и добавить в новый столбец было совпадение или нет.
цикл по столбцу
Я смог дойти только до такого, где отдельно получил каждое мыло и если это не тип list, то делаем другое действие. Проблемы начинаются в поиске совпадений по каждому значению и определению их к нужной строке в df, чтобы если нашлось совпадение добавить true в новый столбец по этой строке. Надеюсь достаточно правильно описал
Офлайн
857
Без pandas в чистом питоне это легко сделать. А чтобы в pandas это делать, нужно изучать pandas.
Так что переведи данные из pandas-формата в обычные списки питона, сделай над этими обычными списками питона нужные изменения, а потом результат переведи обратно в pandas-формат, если тебе так надо - в pandas оставаться.
Отредактировано py.user.next (Авг. 18, 2021 12:48:51)
Офлайн
253
Я думаю тут проблема чуть глубже. Исходные данные таблица, причем ненормализованная. Чел пандасом данные грузит, опять таблица получается, причем крайне дурацкая с None, мейлами через запятую.
На мой взгляд - представление данных в питоне не соответствует реальной структуре данных.
Для питона я бы выбрал список словарей.
data=[ {"email":{}}, # вместо None пустой контейнер {"email":{"mail1@yandex.ru"}}, {"email":{"mail1@yandex.ru","mail2@yandex.ru"}}, # контейнер set потому что мейлы не должны повторяться ]
[None,a,{b,c}]
[{},{a},{b,c}]
Офлайн
857
doza_andСначала ему нужно всё загрузить как есть. Потом уже начинается фильтрация, очистка, переделка и прочие вещи. Например, set может как пользу принести, так и вред. Например, если семантика размещения этих данных такова, что первые адреса важнее последних адресов, то надо сохранять порядок адресов при всех манипуляциях, а set его просто удалит, так как использует произвольный порядок. То есть у него были адреса упорядочены, а ты их делаешь неупорядоченными - так немножечко поправил то, что у него там было изначально.
контейнер set потому что мейлы не должны повторяться
Офлайн
253
py.user.nextУ меня случается что надо сразу фильтровать, потому что много мусора в исходных данных. Просто банально
Сначала ему нужно всё загрузить как есть.
py.user.nextПолностью согласен. Основные мысли что если структуры данных отражают семантику предметной области то программа получается проще и надежнее. И просто таблица пандаса не всегда позволяет это сделать.
Например, set может как пользу принести, так и вред.
Отредактировано doza_and (Авг. 19, 2021 07:06:01)
Офлайн
857
doza_andЭто понятно. Я говорю о том, что фильтрация может быть очень сложной. Код фильтрации начнёт расти по размерам, и оно уже не поместится в одну строчку и потребует чуть ли не сотни юнит-тестов ещё снаружи, которые должны будут всё это прочекать, правильно ли там всё фильтруется. Соответственно, всё это нужно вынести в отдельную программную структуру, изолированную в модуле. Сначала модуль выглядит логическим и встроен просто в код в виде набора функций или там чего, а потом выносится в отдельный физический модуль и помещается в отдельном файле. И физический модуль уже хорошо и удобно тестируется, так как это модуль и он независим от других частей программы, его можешь крутить как хочешь.
У меня случается что надо сразу фильтровать, потому что много мусора в исходных данных.
Офлайн