如何在Pandas DataFrame中仅保留索引连续的行
解决方法:筛选索引存在连续相邻值的DataFrame行
你可以利用Pandas的向量化操作高效实现需求,无需手动循环,代码更简洁且性能更优:
步骤说明
- 计算索引的相邻差值,判断当前索引与前/后索引是否连续(差值为1)
- 标记出属于连续序列的行,最终筛选这些行
代码示例
假设你的DataFrame名为df,执行以下代码:
import pandas as pd # 构造示例数据(与你提供的一致) data = { 'Timestamp': ['2022-03-01T16:28:50.4580078Z', '2022-03-01T17:26:25.8170166Z', '2022-03-01T17:26:45.8480072Z', '2022-03-01T17:27:05.8800048Z', '2022-03-01T18:23:10.9630126Z', '2022-03-01T18:36:12.1380004Z', '2022-03-01T18:36:32.1690063Z', '2022-03-01T18:37:52.2950134Z'], 'Value': [36.000, 37.500, 41.000, 35.250, 36.000, 42.000, 37.000, 34.500] } df = pd.DataFrame(data, index=[316, 344, 345, 346, 374, 387, 388, 391]) # 计算当前索引与前一个/后一个索引的连续情况 is_continuous_with_prev = df.index.to_series().diff() == 1 is_continuous_with_next = df.index.to_series().diff(-1) == -1 # 标记需要保留的行:与前一行连续 或 与后一行连续 keep_rows = is_continuous_with_prev | is_continuous_with_next # 筛选得到结果 result_df = df[keep_rows] print(result_df)
输出结果
Timestamp Value 344 2022-03-01T17:26:25.8170166Z 37.500 345 2022-03-01T17:26:45.8480072Z 41.000 346 2022-03-01T17:27:05.8800048Z 35.250 387 2022-03-01T18:36:12.1380004Z 42.000 388 2022-03-01T18:36:32.1690063Z 37.000
原理说明
df.index.to_series().diff():计算当前索引与前一个索引的差值,等于1则说明和前一行索引连续df.index.to_series().diff(-1):计算当前索引与后一个索引的差值,等于-1则说明和后一行索引连续- 用逻辑或
|合并两个条件,得到所有属于连续序列的行,最终筛选即可
这种方法避免了手动循环的繁琐,同时借助Pandas内部优化,处理大数据集时效率更高。
内容的提问来源于stack exchange,提问作者Bash
相关产品推荐
相关产品推荐

