比较两个具有不同大小的数据框,并在Pandas中创建一个新列

时间:2020-07-29 14:22:57

标签: python pandas numpy dataframe

我有一个很大的数据框,如下所示:

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.Datedf2.Code中一行的所有元素都在df1.Datedf1.Code.的给定行中此外,我希望{{1 }}保留下来(只想在df1中添加新列,说明df1中是否存在相应的'Date''Code'。因此,我不想合并或进行内部联接。

因此,我希望输出为:

df2

2 个答案:

答案 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