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

基于同标签前序行移除Pandas DataFrame行的高效实现

Pandas高效移除重叠区间行的解决方案

核心需求

给定包含first_date、label、last_date列的DataFrame(所有行满足first_date < last_date),需移除所有满足以下条件的行:同标签下,该行的first_date落在其上方任意一行的[first_date, last_date]区间内。要求避免循环,适配万级以上数据量。

解决方案思路

利用Pandas分组+累计最大值的向量操作实现高效处理:

  • 按label分组,跟踪每组内到当前行上方所有行的最大last_date
  • 对比当前行first_date与该最大值,仅保留first_date大于最大值的行(确保不落在任何上方行的区间内)

代码实现

import pandas as pd

# 1. 构造示例数据(替换为你的实际数据)
data = {
    'label': ['A', 'A', 'A', 'B', 'B'],
    'first_date': ['2023-01-01', '2023-01-05', '2023-02-01', '2023-03-01', '2023-03-05'],
    'last_date': ['2023-01-10', '2023-01-15', '2023-02-10', '2023-03-10', '2023-03-08']
}
df = pd.DataFrame(data)

# 2. 确保日期列是datetime类型(关键,否则无法正确比较)
df['first_date'] = pd.to_datetime(df['first_date'])
df['last_date'] = pd.to_datetime(df['last_date'])

# 3. 计算每组内上方行的最大last_date
# cummax()获取到当前行的累计最大last_date,shift(1)得到上方所有行的最大值
df['max_last_prev'] = df.groupby('label')['last_date'].cummax().shift(1)
# 填充分组第一行的空值(用first_date前一天,确保第一行被保留)
df['max_last_prev'] = df['max_last_prev'].fillna(df['first_date'] - pd.Timedelta(days=1))

# 4. 筛选符合条件的行,清理临时列
filtered_df = df[df['first_date'] > df['max_last_prev']].drop(columns=['max_last_prev'])

效果说明

以上代码处理示例数据后,会移除:

  • 标签A的第二行(2023-01-05落在第一行的[2023-01-01, 2023-01-10]区间内)
  • 标签B的第五行(2023-03-05落在第四行的[2023-03-01, 2023-03-10]区间内)

最终保留的行如下:

labelfirst_datelast_date
A2023-01-012023-01-10
A2023-02-012023-02-10
B2023-03-012023-03-10

性能优势

全程使用Pandas内置的向量化操作,无显式循环,时间复杂度为O(n)(n为数据行数),可轻松处理10万级甚至百万级数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 12:03:29