我有一个词典列表
example_list = [{'email':'myemail@email.com'},{'email':'another@email.com'}]
以及带有“电子邮件”列的数据框
我需要将列表与数据帧进行比较,并返回不在数据帧中的值。
我当然可以遍历列表,检查数据框,但我正在寻找一种更加pythonic的方式,可能使用列表推导或数据帧中的map函数?
答案 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))]