You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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结果如下:

Time1ID1Order1
2022-12-14 18:10:32XA
2022-09-15 11:08:26ZC

(注:datetime列显示格式会根据pandas设置调整,实际时间值与输入一致)

内容的提问来源于stack exchange,提问作者asmaa mahmoud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:30:47