[英]Compare two dataframes with different size and create a new column in Pandas
我有一个大的 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
我有一个较小的 dataframe 如下图所示:
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]
我想比较每个 dataframe 'Date'
和'Code'
列,以及df1
中的行是否与df2
的给定行同时具有相同'Date'
和'Code'
。 基于此,我想在df1
中创建一个新列,如果满足上述条件,则声明'True'
,如果不满足,则声明'false'
。 如何快速完成(不使用循环是首选,因为它需要很多时间)?
PS 不保证df2.Date
和df2.Code
的一行中的所有元素都在df1.Date
和 df1.Code 的给定行中df1.Code.
另外,我希望保留df1
中的所有行(只希望在df1
中添加一个新列,说明df2
中是否存在相应'Date'
和'Code'
)。 因此,我不打算合并或进行内部连接。
因此,我想要所需的 output 为:
Date Code ab-ret Match
0 1997-07-02 11 NaN False
1 1997-07-04 11 NaN False
2 1997-07-07 11 NaN False
3 1997-07-08 11 NaN False
4 1997-07-10 11 NaN False
... ... ... ...
377395 2017-12-22 5757 -0.046651 True
377396 2017-12-26 5757 -0.017728 True
377397 2017-12-27 5757 0.024860 True
377398 2017-12-28 5757 0.016094 False
377399 2017-12-29 5757 -0.052789 True
377400 rows × 4 columns
这是一个merge
操作,使用参数indicator=True
得到一个名为 '_merge' 的列靠近你要创建的列 'Match'。 然后只需像在您预期的 output 中一样将此列转换为 False/True 并drop
_merge 列。
df1 = (df1.merge(df2, how='left', indicator=True)
.assign(Match=lambda x: x['_merge'].eq('both'))
.drop('_merge', axis=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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.