python panda得到两个数据帧之间的匹配和不匹配记录

2024-04-26 10:16:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始在python中使用pandas,但是我对使用python有很好的了解。在

我有两个数据帧,我必须从中获取匹配记录和不匹配记录到新的数据帧中。在

示例:

DF1:

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 450000

DF2:

^{pr2}$

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

匹配\u-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 u不匹配:

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

这就产生了两个数据帧中的所有唯一键。但这也会产生不匹配的记录。在

但我得到的结果是:

^{pr2}$

第四个记录也被包括在内。在

在这里,只有工资列是变化的,但在实时,它可能是一个列科尔比较。在

从这里,我只需要得到匹配的记录到匹配的_df,而不匹配的记录到不匹配的_df。在

请帮我做这件事。在

Note: My dataset might be a massive one (100 million records in both datasets) so, please get me an effective approach reducing the time of execution.

提前谢谢。在


Tags: 数据nameidnumberpandasdfon记录
3条回答

对您的问题的简单回答是df1.where:

注意:生成的具有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,那么它将默认为两个数据帧中列的交集。在

^{2}$

如果要联接列或索引级别,请使用on。在

 >>> 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中的不匹配:您可以选择isin(dict)方法:

>>> df2[~df2.isin(df1.to_dict('l')).all(1)]
          DoB  ID Name  Salary
3  05-09-2000   4  DDD  540000

梅布尔给的另一种方式。在

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

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

例如:

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

MatchDF = DF1[DF1["Salary"] == DF1["Salary2"]]
MisMatchDF = DF1[DF1["Salary"] != DF1["Salary2"]]
# 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]

相关问题 更多 >