比较字典列表到数据框,显示缺失值

时间:2018-05-18 17:21:30

标签: python pandas

我有一个词典列表

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

以及带有“电子邮件”列的数据框

我需要将列表与数据帧进行比较,并返回不在数据帧中的值。

我当然可以遍历列表,检查数据框,但我正在寻找一种更加pythonic的方式,可能使用列表推导或数据帧中的map函数?

4 个答案:

答案 0 :(得分:1)

要在DataFrame.email中返回 not 的值,这里有几个涉及设置差异操作的选项 -

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'])

答案 1 :(得分:1)

一种方法是从另一个方法中取一个set。对于功能解决方案,您可以使用operator.itemgetter

from operator import itemgetter

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

注意-set.difference的语法糖。

答案 2 :(得分:0)

假设您有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'}]

答案 3 :(得分:0)

我最终将列表转换为数据帧,通过在列上合并它们来比较两个数据帧,然后从缺失的值中创建数据帧

所以,例如

    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))]