сравнить список словарей с данными, показать пропущенные значения - PullRequest
0 голосов
/ 18 мая 2018

У меня есть список словарей

example_list = [{'email':'myemail@email.com'},{'email':'another@email.com'}]

и фрейм данных со столбцом 'Email'

Мне нужно сравнить список с фреймом данных и вернуть значения, которых нет вфрейм данных.

Конечно, я могу перебирать список, проверять фрейм данных, но я искал более питонический способ, возможно, с использованием понимания списка или, возможно, функции карты в фреймах данных?

Ответы [ 4 ]

0 голосов
/ 19 мая 2018

В итоге я преобразовал список в фрейм данных, сравнил два фрейма данных, объединив их в столбце, а затем создал фрейм данных из пропущенных значений

, например,

    example_list = [{'email':'myemail@email.com'},{'email':'another@email.com'}]
    df_two = pd.DataFrame(item for item in example_list)
    common = df_one.merge(df_two, on=['Email'])
    df_diff = df_one[(~df_one.Email.isin(common.Email))]
0 голосов
/ 18 мая 2018

Чтобы вернуть те значения, которые не в DataFrame.email, вот несколько опций, включающих операции с разницей множеств -

np.setdiff1d

emails = [d['email'] for d in example_list)]
diff = np.setdiff1d(emails, df['Email'])   # returns a list

set.difference

# returns a set
diff = set(d['email'] for d in example_list)).difference(df['Email'])
0 голосов
/ 18 мая 2018

Один из способов - взять один set у другого.Для функционального решения вы можете использовать operator.itemgetter:

from operator import itemgetter

res = set(map(itemgetter('email'), example_list)) - set(df['email'])

Примечание - - синтаксический сахар для set.difference.

0 голосов
/ 18 мая 2018

Предположим, у вас есть df

df = pd.DataFrame({"email": ['myemail@email.com','bar@email.com','foo@email.com']})

    email
0   myemail@email.com
1   bar@email.com
2   foo@email.co

и список

e = [{'email':'myemail@email.com'},{'email':'another@email.com'}]

Вы можете использовать df.isin, чтобы проверить, какие значения из df находятся в списке

df.email.isin([k['email'] for k in e])

    email
0   True
1   False
2   False

и используйте оператор ~, чтобы проверить, какие значения не в списке

df[~df.email.isin([k['email'] for k in e])]

    email
1   bar@email.com
2   foo@email.com

Если вы хотите сделать другой способоколо значений, которые не находятся в df, вы можете использовать np.isin

>>> e = np.array([{'email':'myemail@email.com'},{'email':'another@email.com'}])
>>> e[~np.isin([k['email'] for k in e], df.email)]
[{'email': 'another@email.com'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...