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

如何根据首行条件删除Pandas DataFrame中未知数量的前n行

问题:在Pandas DataFrame中依据首行时间戳秒数删除前置行

需要实现:给定含时间戳的DataFrame,删除所有与首行时间戳秒数相同的前置连续行,保留剩余数据结构。已获取首行秒数,但不知如何完成行删除。


示例代码与当前数据

示例构造代码

import pandas as pd
from datetime import datetime
# 构造示例DataFrame
d = {(0) : [pd.DatetimeIndex([datetime.strptime(s, '%Y-%m-%d %H:%M:%S')])[0] 
                            for s in ['2001-12-23 01:23:59',
                                      '2001-12-23 01:23:59',
                                      '2001-12-23 01:23:59',
                                      '2001-12-23 01:24:00',
                                      '2001-12-23 01:24:00',
                                      '2001-12-23 01:24:01',
                                      '2001-12-23 01:24:02',
                                      '2001-12-23 01:24:02'
                                      ]],
                            (1) : [10,11,12,13,14,15,16,17]
                            }

df1 = pd.DataFrame(data=d)
# 获取首行时间戳的秒数(原代码)
sec_1 = df1[0].head(1).dt.second

当前DataFrame状态

0   1
0 2001-12-23 01:23:59  10
1 2001-12-23 01:23:59  11
2 2001-12-23 01:23:59  12
3 2001-12-23 01:24:00  13
4 2001-12-23 01:24:00  14
5 2001-12-23 01:24:01  15
6 2001-12-23 01:24:02  16
7 2001-12-23 01:24:02  17

期望结果

0   1
3 2001-12-23 01:24:00  13
4 2001-12-23 01:24:00  14
5 2001-12-23 01:24:01  15
6 2001-12-23 01:24:02  16
7 2001-12-23 01:24:02  17

解决方案

步骤说明

  1. 优化首行秒数获取:原代码返回Series,直接取标量值更方便后续判断
  2. 生成保留掩码:利用cummax()确保只删除开头连续的目标秒数行,后续出现的相同秒数行不会被误删
  3. 筛选DataFrame:用掩码过滤得到结果

完整实现代码

import pandas as pd
from datetime import datetime

# 构造示例DataFrame
d = {(0) : [pd.DatetimeIndex([datetime.strptime(s, '%Y-%m-%d %H:%M:%S')])[0] 
                            for s in ['2001-12-23 01:23:59',
                                      '2001-12-23 01:23:59',
                                      '2001-12-23 01:23:59',
                                      '2001-12-23 01:24:00',
                                      '2001-12-23 01:24:00',
                                      '2001-12-23 01:24:01',
                                      '2001-12-23 01:24:02',
                                      '2001-12-23 01:24:02'
                                      ]],
                            (1) : [10,11,12,13,14,15,16,17]
                            }

df1 = pd.DataFrame(data=d)

# 获取首行时间戳的秒数(直接取标量值)
sec_1 = df1[0].iloc[0].second

# 生成掩码:标记需要保留的行(第一个非目标秒数行及之后全部保留)
mask = (df1[0].dt.second != sec_1).cummax()

# 筛选得到结果
result_df = df1[mask]
print(result_df)

代码解释

  • df1[0].iloc[0].second:直接提取首行时间戳的秒数,得到整数(示例中为59)
  • (df1[0].dt.second != sec_1):生成布尔序列,每行秒数不等于目标值则为True
  • .cummax():对布尔序列取累积最大值,第一个True之后的所有元素都会变为True,确保仅删除开头连续的目标行
  • df1[mask]:用掩码筛选,保留所有标记为True的行

内容的提问来源于stack exchange,提问作者chairman's_cat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:46:05