如何使用pandas打印两列之间的差异?

3

我是一名有帮助的助手,可以为您翻译以下内容:

我有两个数据集

一个数据集中有一个包含电子邮件地址列表的列:

DF1

Email
xxxx@abc.gov
xxxx@abc.gov
xxxx@abc.gov
xxxx@abc.gov
xxxx@abc.gov

2nd csv Dataframe2

Email
xxxx@abc.gov
xxxx@abc.gov
xxxx@abc.gov
xxxx@abc.gov
dddd@abc.com
dddd@abc.com
3333@abc.com

import pandas as pd

SansList = r'C:\\Sans compare\\SansList.csv'
AllUsers = r'C:\\Sans compare\\AllUser.csv'

## print Name column only and turn into data sets from CSV ##
df1 = pd.read_csv(SansList, usecols=[0])

df2 = pd.read_csv(AllUsers, usecols=[2])

**print(df1['Email'].isin(df2)==False)**

我希望得到的结果是,

Dataframe3
dddd@abc.com
dddd@abc.com
3333@abc.com

我不太确定如何修复我的数据集... :(



我认为你不想使用pandas,而是使用集合。set(df1['Email'].values),然后使用set.intersection()。 - Keith
https://dev59.com/3WYq5IYBdhLWcg3w-FPP - davidjbeiler
你有另一个例子吗? - davidjbeiler
2个回答

1
Option 1
isin
df2[~df2.Email.isin(df1.Email)]

          Email
4  dddd@abc.com
5  dddd@abc.com
6  3333@abc.com

选项2
查询
df2.query('Email not in @df1.Email')

          Email
4  dddd@abc.com
5  dddd@abc.com
6  3333@abc.com

选项 3
merge

使用 pd.DataFrame.mergeindicator=True,可以查看行来自哪个数据框。然后我们可以根据它进行过滤。

df2.merge(
    df1, 'outer', indicator=True
).query('_merge == "left_only"').drop('_merge', 1)

           Email
20  dddd@abc.com
21  dddd@abc.com
22  3333@abc.com

它一直打印我在df2中的所有电子邮件列表。 - davidjbeiler
你需要将结果重新分配给 df2。我没有覆盖你的变量。只需执行 df2 = df2[~df2.Email.isin(df1.Email)] - piRSquared
我已经做了,但它仍然打印出我的主列表中的所有内容,它没有进行比较 :( - davidjbeiler
那么,你的 CSV 文件存在问题,导致你期望相等的内容实际上并不相等。 - piRSquared
1
显然,pandas是区分大小写的:( - davidjbeiler

1
Numpy解决方案:
In [311]: df2[~np.in1d(df2.Email, df1.Email)]
Out[311]:
          Email
4  dddd@abc.com
5  dddd@abc.com
6  3333@abc.com

无法工作,它打印了我数据框2中的所有内容,而不是差异。 - davidjbeiler
@davidjbeiler,你是什么意思?你在代码中读取了它:df2 = pd.read_csv(AllUsers, usecols=[2])... - MaxU - stand with Ukraine
它正在打印我数据框2中的所有内容,而不是差异。 - davidjbeiler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接