基于同标签前序行移除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]区间内)
最终保留的行如下:
| label | first_date | last_date |
|---|---|---|
| A | 2023-01-01 | 2023-01-10 |
| A | 2023-02-01 | 2023-02-10 |
| B | 2023-03-01 | 2023-03-10 |
性能优势
全程使用Pandas内置的向量化操作,无显式循环,时间复杂度为O(n)(n为数据行数),可轻松处理10万级甚至百万级数据。
内容的提问来源于stack exchange,提问作者atjw94
相关产品推荐
相关产品推荐

