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
相关产品推荐
相关产品推荐

