Найти - Пользователи
Полная версия: Pandas перебрать столбец с вложенным списком
Начало » Python для новичков » Pandas перебрать столбец с вложенным списком
1
Nikita21z
Всем привет! У меня есть две таблицы 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 в новый столбец по этой строке. Надеюсь достаточно правильно описал
py.user.next
Без pandas в чистом питоне это легко сделать. А чтобы в pandas это делать, нужно изучать pandas.

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

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

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

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

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

py.user.next
doza_and
У меня случается что надо сразу фильтровать, потому что много мусора в исходных данных.
Это понятно. Я говорю о том, что фильтрация может быть очень сложной. Код фильтрации начнёт расти по размерам, и оно уже не поместится в одну строчку и потребует чуть ли не сотни юнит-тестов ещё снаружи, которые должны будут всё это прочекать, правильно ли там всё фильтруется. Соответственно, всё это нужно вынести в отдельную программную структуру, изолированную в модуле. Сначала модуль выглядит логическим и встроен просто в код в виде набора функций или там чего, а потом выносится в отдельный физический модуль и помещается в отдельном файле. И физический модуль уже хорошо и удобно тестируется, так как это модуль и он независим от других частей программы, его можешь крутить как хочешь.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB