Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 18, 2021 09:28:24

Nikita21z
Зарегистрирован: 2021-08-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Pandas перебрать столбец с вложенным списком

Всем привет! У меня есть две таблицы 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 в новый столбец по этой строке. Надеюсь достаточно правильно описал

Офлайн

#2 Авг. 18, 2021 12:45:35

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Pandas перебрать столбец с вложенным списком

Без pandas в чистом питоне это легко сделать. А чтобы в pandas это делать, нужно изучать pandas.

Так что переведи данные из pandas-формата в обычные списки питона, сделай над этими обычными списками питона нужные изменения, а потом результат переведи обратно в pandas-формат, если тебе так надо - в pandas оставаться.



Отредактировано py.user.next (Авг. 18, 2021 12:48:51)

Офлайн

#3 Авг. 18, 2021 20:02:41

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Pandas перебрать столбец с вложенным списком

Я думаю тут проблема чуть глубже. Исходные данные таблица, причем ненормализованная. Чел пандасом данные грузит, опять таблица получается, причем крайне дурацкая с None, мейлами через запятую.

На мой взгляд - представление данных в питоне не соответствует реальной структуре данных.
Для питона я бы выбрал список словарей.

  
data=[
  {"email":{}}, # вместо  None пустой контейнер
  {"email":{"mail1@yandex.ru"}},
  {"email":{"mail1@yandex.ru","mail2@yandex.ru"}},  # контейнер set  потому что мейлы не должны повторяться
        ]

Данные должны должны быть организованы так чтоббы их просто нельзя было задать так чтобы нарушались инварианты. Работа для всех частных случаев должнв авполняться единообразно
те не
 [None,a,{b,c}]
А
 [{},{a},{b,c}]

Тогда каждый объект поддерживает протокол итератора



Офлайн

#4 Авг. 19, 2021 02:03:27

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Pandas перебрать столбец с вложенным списком

doza_and
контейнер set потому что мейлы не должны повторяться
Сначала ему нужно всё загрузить как есть. Потом уже начинается фильтрация, очистка, переделка и прочие вещи. Например, set может как пользу принести, так и вред. Например, если семантика размещения этих данных такова, что первые адреса важнее последних адресов, то надо сохранять порядок адресов при всех манипуляциях, а set его просто удалит, так как использует произвольный порядок. То есть у него были адреса упорядочены, а ты их делаешь неупорядоченными - так немножечко поправил то, что у него там было изначально.



Офлайн

#5 Авг. 19, 2021 07:05:36

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Pandas перебрать столбец с вложенным списком

py.user.next
Сначала ему нужно всё загрузить как есть.
У меня случается что надо сразу фильтровать, потому что много мусора в исходных данных. Просто банально
в память не влезет.

py.user.next
Например, set может как пользу принести, так и вред.
Полностью согласен. Основные мысли что если структуры данных отражают семантику предметной области то программа получается проще и надежнее. И просто таблица пандаса не всегда позволяет это сделать.



Отредактировано doza_and (Авг. 19, 2021 07:06:01)

Офлайн

#6 Авг. 19, 2021 13:16:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Pandas перебрать столбец с вложенным списком

doza_and
У меня случается что надо сразу фильтровать, потому что много мусора в исходных данных.
Это понятно. Я говорю о том, что фильтрация может быть очень сложной. Код фильтрации начнёт расти по размерам, и оно уже не поместится в одну строчку и потребует чуть ли не сотни юнит-тестов ещё снаружи, которые должны будут всё это прочекать, правильно ли там всё фильтруется. Соответственно, всё это нужно вынести в отдельную программную структуру, изолированную в модуле. Сначала модуль выглядит логическим и встроен просто в код в виде набора функций или там чего, а потом выносится в отдельный физический модуль и помещается в отдельном файле. И физический модуль уже хорошо и удобно тестируется, так как это модуль и он независим от других частей программы, его можешь крутить как хочешь.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version