我是在python中使用熊猫的新手,而我在使用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:
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
而且,这里的主键是ID和名称(实际上,键的数量可能有所不同),我需要获取
Match_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
Mismatch_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
第4条记录也包括在内。
在这里,只有薪水上校在变化,但是在实时情况下,它可能是要比较的上校列表。
由此,我必须仅将匹配的记录获取到matched_df,将不匹配的记录获取到mismatch_df。
请帮助我。
注意:我的数据集可能是一个庞大的数据集(两个数据集中都有1亿条记录),因此,请给我一种有效的方法来减少执行时间。
谢谢。
答案 0 :(得分:0)
我的解决方案会有所不同,将涉及简单地从其他数据集中复制薪水。
例如:
DF1["Salary2"] = DF2["Salary"]
MatchDF = DF1[DF1["Salary"] == DF1["Salary2"]]
MisMatchDF = DF1[DF1["Salary"] != DF1["Salary2"]]
答案 1 :(得分:0)
简单的答案是使用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,则它将默认使用两个DataFrame中列的交集。
>>> 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
如果您希望加入列或索引级别,请使用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
Mabel给出的另一种方式。
df2[~df2.isin(df1).all(axis=1)]
答案 2 :(得分:0)
要获得比赛:
>> 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
答案 3 :(得分:0)
# 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]