忽略Timestamp列比较两个DataFrame,提取仅在第一个df中存在的行
解决方案
你可以用pandas的两种常用方法实现需求,都不需要修改原有数据的Timestamp字段,仅基于指定列做匹配:
方法1:merge标记法(兼容性最好,适合大数据量、多比较列场景)
核心逻辑是对两个df做左连接,用连接标记筛选仅在df1中存在的行:
import pandas as pd # 此处替换为你自己读取df1、df2的代码,比如pd.read_excel/ pd.read_csv # 示例数据构造可忽略 df1 = pd.DataFrame({ 'A': ['A1', 'A1', 'A1', 'A1', 'A1'], 'B': ['B1', 'B1', 'B1', 'B2', 'B2'], 'Start': ['2022-01-15', '2021-07-15', '2021-07-30', '2022-01-01', '2021-06-02'], 'End': ['2022-02-15', '2021-10-17', '2021-10-02', '2023-01-01', '2021-06-04'], 'Timestamp': ['2021-05-17', '2021-05-17', '2021-05-16', '2021-05-17', '2021-05-16'] }) df2 = pd.DataFrame({ 'A': ['A1', 'A1', 'A1', 'A1'], 'B': ['B1', 'B1', 'B1', 'B3'], 'Start': ['2022-01-15', '2021-07-15', '2021-07-30', '2021-07-02'], 'End': ['2022-02-15', '2021-10-17', '2021-10-02', '2021-08-04'], 'Timestamp': ['2021-05-16', '2021-05-16', '2021-05-15', '2021-05-14'] }) # 自动生成排除Timestamp的比较列列表 compare_cols = [col for col in df1.columns if col != 'Timestamp'] # 左连接并标记来源 merge_df = df1.merge(df2[compare_cols], on=compare_cols, how='left', indicator=True) # 筛选仅在df1中存在的行,删除标记列 df1_unique = merge_df[merge_df['_merge'] == 'left_only'].drop('_merge', axis=1) print(df1_unique)
方法2:多列值匹配法(代码更简洁,适合小数据量场景)
核心逻辑是把每行的比较列值转为元组,判断df1的元组是否不存在于df2的元组集合中:
compare_cols = [col for col in df1.columns if col != 'Timestamp'] df1_unique = df1[~df1[compare_cols].apply(tuple, axis=1).isin(df2[compare_cols].apply(tuple, axis=1))]
两种方法运行后输出的结果都和你给出的预期一致,会完整保留df1独有行的所有字段,包括Timestamp。
内容的提问来源于stack exchange,提问作者JDK
相关产品推荐
相关产品推荐

