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

Pandas如何基于匹配值与时间范围的关联条件删除DataFrame行

Pandas按指定条件删除行实现方案

前置类型处理

首先将DateTime列转换为Pandas时间类型,方便后续时间范围计算。如果还未生成B列,也可以直接按规则生成:

import pandas as pd

# 若已有DataFrame可跳过示例数据构造环节
data = [
    [161, False, 'send:', '2021-10-20 13:10:18'],
    [202, False, 'get', '2021-10-20 13:10:20'],
    [202, False, 'take', '2021-10-20 13:10:21'],
    [161, False, 'reply', '2021-10-20 13:12:25'],
    [202, True, 'send', '2021-10-20 13:15:18'],
    [161, False, 'get', '2021-10-20 13:15:20'],
    [161, False, 'take', '2021-10-20 13:15:21'],
    [202, False, 'reply', '2021-10-20 13:15:25']
]
df = pd.DataFrame(data, columns=['Number', 'B', 'Action', 'DateTime'])

# 转换时间列类型
df['DateTime'] = pd.to_datetime(df['DateTime'])

# 未生成B列可执行以下代码
# df['B'] = df['Action'] == 'send'

核心删除逻辑

以B列为True的行作为参考行,标记所有符合删除条件的行后过滤:

# 提取所有参考行
ref_rows = df[df['B'] == True]
# 初始化删除标记,默认全不删除
to_drop = pd.Series([False]*len(df), index=df.index)

# 遍历所有参考行,标记需要删除的行
for _, ref in ref_rows.iterrows():
    # 条件1:Number与参考行相等
    same_num = df['Number'] == ref['Number']
    # 条件2:时间处于参考行前后2分钟范围内
    in_time_range = df['DateTime'].between(
        ref['DateTime'] - pd.Timedelta(minutes=2),
        ref['DateTime'] + pd.Timedelta(minutes=2)
    )
    # 同时满足两个条件的行标记为待删除
    to_drop = to_drop | (same_num & in_time_range)

# 过滤得到结果
df_result = df[~to_drop]

结果验证

执行后df_result的输出与预期结果完全一致,会自动删除符合条件的第5行(参考行本身)和第8行(Number=202且在时间范围内的reply行)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:06:01