如何在Pandas中筛选df1中不存在于df2的行(基于三列)
筛选DataFrame中仅存在于df1的行(基于datetime及指定列)
需求:基于Time1(datetime格式)、ID1、Order1三列,筛选出df1中不存在于df2的行,生成新的DataFrame df3。注意df2的对应列名为Time2、ID2、Order2。
解决步骤
首先确保两个DataFrame的时间列均为datetime类型,避免格式不匹配导致的匹配错误:
import pandas as pd # 转换时间列为datetime类型 df1['Time1'] = pd.to_datetime(df1['Time1']) df2['Time2'] = pd.to_datetime(df2['Time2'])
方法一:使用merge左连接(推荐,大数据量更高效)
通过左连接标记匹配状态,筛选仅在df1中存在的行:
# 左连接,指定对应匹配列 merged_df = df1.merge( df2, left_on=['Time1', 'ID1', 'Order1'], right_on=['Time2', 'ID2', 'Order2'], how='left', indicator=True # 添加_merge列标记匹配状态 ) # 筛选仅在df1中存在的行,保留原df1的列 df3 = merged_df[merged_df['_merge'] == 'left_only'][['Time1', 'ID1', 'Order1']]
方法二:使用元组集合匹配(直观易理解)
将df2的目标列打包成元组集合,通过行匹配筛选:
# 把df2的目标列转换成元组集合 df2_matched_set = set(zip(df2['Time2'], df2['ID2'], df2['Order2'])) # 筛选df1中不在集合内的行 df3 = df1[~df1.apply(lambda row: (row['Time1'], row['ID1'], row['Order1']) in df2_matched_set, axis=1)]
示例验证
用你提供的示例数据运行上述代码后,生成的df3结果如下:
| Time1 | ID1 | Order1 |
|---|---|---|
| 2022-12-14 18:10:32 | X | A |
| 2022-09-15 11:08:26 | Z | C |
(注:datetime列显示格式会根据pandas设置调整,实际时间值与输入一致)
内容的提问来源于stack exchange,提问作者asmaa mahmoud
相关产品推荐
相关产品推荐

