python pandas-获取两个数据帧之间的匹配和不匹配记录

python pandas-获取两个数据帧之间的匹配和不匹配记录,python,pandas,compare,Python,Pandas,Compare,我是python中使用pandas的新手,而我在python方面有很好的知识 我有两个数据帧,从中我必须将匹配的记录和不匹配的记录放入新的数据帧中 例如: DF1: DF2: 而且,这里主键是ID和Name(实际上,键的数量可能会有所不同),我需要 匹配_df: ID Name Number DOB Salary 1 AAA 1234 12-05-1996 100000 2 BBB 1235 16-08-1997 200000 3 CCC 1236 24-0

我是python中使用pandas的新手,而我在python方面有很好的知识

我有两个数据帧,从中我必须将匹配的记录和不匹配的记录放入新的数据帧中

例如:

DF1:

DF2:

而且,这里主键是ID和Name(实际上,键的数量可能会有所不同),我需要

匹配_df:

ID Name Number    DOB     Salary
1  AAA  1234   12-05-1996 100000
2  BBB  1235   16-08-1997 200000
3  CCC  1236   24-04-1998 389999
不匹配_df:

ID Name Number    DOB     Salary
4  DDD  1237   05-09-2000 540000
我试过所有可能的方法,比如

pd.merge(df1, df2, left_on=[ID,Name],right_on=[ID,Name], how='inner')
这将生成两个数据帧中的所有唯一键。但这也会产生不匹配的记录

但我得到的结果是:

ID Name Number    DOB     Salary
1  AAA  1234   12-05-1996 100000
2  BBB  1235   16-08-1997 200000
3  CCC  1236   24-04-1998 389999
4  DDD  1237   05-09-2000 540000
第四张唱片也被包括在内

在这里,只有薪资col是可变的,但在实时情况下,它可能是要比较的col列表

从这里,我只需要得到匹配的_-df的匹配记录和不匹配的_-df的非匹配记录

请帮我做这件事

注意:我的数据集可能是一个巨大的数据集(两个数据集中都有1亿条记录),因此,请给我一个有效的方法来减少执行时间


提前感谢。

我的解决方案会有点不同,只需从另一个数据集中复制工资即可

例如:

DF1["Salary2"] = DF2["Salary"]

MatchDF = DF1[DF1["Salary"] == DF1["Salary2"]]
MisMatchDF = DF1[DF1["Salary"] != DF1["Salary2"]]

您的问题的简单答案是使用
df1。其中

注意:带有NaN的结果单元格不满足条件,即它们在两个数据帧中不相等。具有实值的数据帧是两个数据帧中相等的数据帧

>>> df1.where(df1.Salary==df2.Salary)
          DoB   ID  Name    Salary
0  12-05-1996  1    AAA  100000.0
1  16-08-1997  2    BBB  200000.0
2  24-04-1998  3    CCC  389999.0
3         NaN  NaN  NaN       NaN
使用
pd.merge
:如果您只想合并没有列或索引级别的df1和df1,那么它将默认为两个数据帧中列的交点

>>> pd.merge(df1, df2)
          DoB  ID Name  Salary
0  12-05-1996   1  AAA  100000
1  16-08-1997   2  BBB  200000
2  24-04-1998   3  CCC  389999
如果您希望加入列或索引级别,请在
上使用

 >>> pd.merge(df1, df2, on="Salary")
        DoB_x  ID_x Name_x  Salary       DoB_y  ID_y Name_y
0  12-05-1996     1    AAA  100000  12-05-1996     1    AAA
1  16-08-1997     2    BBB  200000  16-08-1997     2    BBB
2  24-04-1998     3    CCC  389999  24-04-1998     3    CCC
对于
df2
中的不匹配:
您可以选择方法:

梅布尔给的另一种方式

df2[~df2.isin(df1).all(axis=1)]
要获得比赛:

>> df1.merge(df2)

ID Name  Number         DOB  Salary
0   1  AAA    1234  12-05-1996  100000
1   2  BBB    1235  16-08-1997  200000
2   3  CCC    1236  24-04-1998  389999
对于不匹配,选择df2中的行:

>> df2[~df2.isin(df1).all(axis=1)]

   Name  Number         DOB  Salary
ID                                 
4   DDD    1237  05-09-2000  540000

但实际上,我的真实数据集可能包含“n”个要检查的列,这样做会使我的代码硬编码,还可能导致性能不佳……我的意思是,你应该尝试合并,但保留薪资列不变,然后在事后进行比较。可能更容易。但我是一个新手,非常感谢你的观点,我已经投了赞成票,但我不认为这会反映出我是一个新的投稿人……你有多个答案,你可以用一个来从未回答的队列中清除这个问题。是的,但实际上我仍在努力解决这个问题。这就是为什么我仍然保留这个。当我传递COL列表而不是“SALLAY”时,会抛出“异常:无法处理非唯一的多索引!”错误……好的,我不知道您正在比较多个列。待命。我将在短期内进一步更新此内容以删除循环-此操作现在对您有效吗?删除了循环并使比较所有列或仅比较选定列变得容易。非常感谢,您的操作非常棒。我只是需要做一些更多的改变来完成我想要的工作。太谢谢你了!!!!谢谢你花时间回答我的问题,我已经投了赞成票,但我不认为这会反映出我是新的投稿人。。。
df2[~df2.isin(df1).all(axis=1)]
>> df1.merge(df2)

ID Name  Number         DOB  Salary
0   1  AAA    1234  12-05-1996  100000
1   2  BBB    1235  16-08-1997  200000
2   3  CCC    1236  24-04-1998  389999
>> df2[~df2.isin(df1).all(axis=1)]

   Name  Number         DOB  Salary
ID                                 
4   DDD    1237  05-09-2000  540000
# pick index keys and compare column(s)
keys = ['ID', 'Name']
# if comparing all columns:
col_list = [col for col in df1.columns if col not in keys]
# # if comparing specific columns:
# col_list = ['Salary', 'DOB']

# extend keys with col_list for next step
sel_cols = keys.copy()
sel_cols.extend(col_list)

# set a multi-index with keys
# to dataframes with col_list columns
dfa = df1[sel_cols].set_index(keys)
dfb = df2[sel_cols].set_index(keys)

# make an equivalency boolean mask
dfa.update(dfb)
mask = np.equal(df1[col_list].values, dfa.values).all(axis=1)

# slice df1 with mask
Match_df = df1[mask]
Mismatch_df = df1[~mask]