如何根据首行条件删除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
解决方案
步骤说明
- 优化首行秒数获取:原代码返回Series,直接取标量值更方便后续判断
- 生成保留掩码:利用
cummax()确保只删除开头连续的目标秒数行,后续出现的相同秒数行不会被误删 - 筛选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
相关产品推荐
相关产品推荐

