如何对比一个DataFrame的单列值与另一DataFrame并筛选匹配行
报错原因
x == df2['DATE']会返回和df2行数相同的布尔Series,每个元素对应df2该行的DATE是否等于x,if语句无法直接对Series做布尔判定,因此触发该错误。
注意:匹配前建议先统一两个表DATE列的格式,比如都转为datetime类型,避免因类型不一致导致匹配失败,转换代码参考:
import pandas as pd df1['DATE'] = pd.to_datetime(df1['DATE']) df2['DATE'] = pd.to_datetime(df2['DATE'])
解决方案
方法1:修改原有循环逻辑
只需调整if判断的条件,用any()方法判断是否存在匹配项即可,修改后的代码:
for index,row in df1.iterrows(): x = row['DATE'] if (df2['DATE'] == x).any(): print('Found') new = df2[df2['DATE'] == x] print(new) else: print(f'{x} Not Found')
运行输出结果:
Found ID NAME DATE 0 1 abc 2020-05-20 1 2 bcd 2020-05-20 2020-05-21 Not Found
方法2:向量化操作(推荐,性能更高)
不需要循环,直接用pandas自带的isin()方法一次性筛选所有匹配行,代码更简洁,大数据量下性能远高于循环写法:
# 筛选所有DATE在df1的DATE列中的df2行 matched_df = df2[df2['DATE'].isin(df1['DATE'])] print(matched_df)
运行输出结果:
ID NAME DATE 0 1 abc 2020-05-20 1 2 bcd 2020-05-20
如果需要单独标记df1每个日期是否匹配,可以补充如下代码:
df1['是否匹配'] = df1['DATE'].isin(df2['DATE']) print(df1)
运行输出结果:
DATE 是否匹配 0 2020-05-20 True 1 2020-05-21 False
内容的提问来源于stack exchange,提问作者naina
相关产品推荐
相关产品推荐

