我有一个很大的数据框,如下所示:
df1:
Date Code ab-ret
0 1997-07-02 11 NaN
1 1997-07-04 11 NaN
2 1997-07-07 11 NaN
3 1997-07-08 11 NaN
4 1997-07-10 11 NaN
... ... ... ...
377395 2017-12-22 5757 -0.046651
377396 2017-12-26 5757 -0.017728
377397 2017-12-27 5757 0.024860
377398 2017-12-28 5757 0.016094
377399 2017-12-29 5757 -0.052789
377400 rows × 3 columns
我的数据框较小,如下所示:
df2:
Date Code
0 2009-03-17 11
1 2010-02-03 11
2 2011-02-14 363
3 2015-01-09 363
4 2010-10-15 365
... ... ...
9516 2015-02-24 449479
9517 2015-09-01 449479
9518 2016-04-01 449479
9519 2013-06-21 452095
9520 2015-05-06 553720
[9521 rows x 2 columns]
我想比较每个数据帧的列'Date'
和'Code'
,以及df1
中的行是否与给定的'Date'
和'Code'
相同df2
行。基于此,我想在df1
中创建一个新列,如果满足上述条件,则声明'True'
,如果不满足,则声明'false'
。如何快速完成(最好不使用循环,因为这会花费很多时间)?
P.S。不能保证df2.Date
和df2.Code
中一行的所有元素都在df1.Date
和df1.Code.
的给定行中此外,我希望{{1 }}保留下来(只想在df1
中添加新列,说明df1
中是否存在相应的'Date'
和'Code'
。因此,我不想合并或进行内部联接。
因此,我希望输出为:
df2
答案 0 :(得分:1)
这是一个merge
操作,使用参数indicator=True
在要创建的“匹配”列附近获取名为“ _merge”的列。然后只需要像预期输出中那样将此列转换为False / True,并{_1erge}转换为_merge列即可。
drop
答案 1 :(得分:1)
IIUC,您还可以通过pd.DataFrame.set_index()
并使用pd.DataFrame.isin
来进行元组比较:
df1.set_index(['Date','Code']).index.isin(df2.set_index(['Date','Code']).index.to_list())
示例:
d={'Date': {0: pd.Timestamp('1997-07-02 00:00:00'), 1: pd.Timestamp('1997-07-04 00:00:00'), 2: pd.Timestamp('1997-07-07 00:00:00')},
'Code': {0: 11, 1: 13, 2: 14}, 'ab-ret': {0: np.nan, 1: np.nan, 2: np.nan}}
df1=pd.DataFrame(d)
df1
# Date Code ab-ret
#0 1997-07-02 11 NaN
#1 1997-07-04 13 NaN
#2 1997-07-07 14 NaN
d={'Date': {0: pd.Timestamp('1997-07-02 00:00:00'), 1: pd.Timestamp('1997-07-04 00:00:00')},
'Code': {0: 11, 1: 11}, 'ab-ret': {0: np.nan, 1: np.nan}}
df2=pd.DataFrame(d)
df2
# Date Code ab-ret
#0 1997-07-02 11 NaN
#1 1997-07-04 11 NaN
df1['Match']=df1.set_index(['Date','Code']).index.isin(df2.set_index(['Date','Code']).index.to_list())
df1
# Date Code ab-ret Match
#0 1997-07-02 11 NaN True
#1 1997-07-04 13 NaN False
#2 1997-07-07 14 NaN False