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

如何基于DataFrame筛选结果查找Col3后续值变化行并计算时间差

解决Pandas中筛选行后查找后续Col3首次变化行并计算时间差的问题

步骤1:获取符合条件的筛选行

先执行你提供的筛选逻辑,得到目标行集:

import pandas as pd

# 假设你的DataFrame名为df,且包含Time列用于计算时间差
filtered_df = df[(df['Col1'] == 49.8) & (df['Col2'] != 0) & (df['Col2'].abs() > 0.02)].copy()

步骤2:标记Col3的所有变化点

先定位DataFrame中所有Col3值发生变化的行,后续用于匹配筛选行的首次变化:

# 标记Col3与上一行不同的行
df['Col3_changed'] = df['Col3'] != df['Col3'].shift()
# 提取所有变化点的索引
change_indices = df[df['Col3_changed']].index

步骤3:匹配每个筛选行的后续首次变化行

通过筛选行的索引,在变化点索引中找到第一个大于它的索引,对应就是后续Col3首次变化的行:

import numpy as np

# 遍历筛选行索引,获取对应的首次变化行索引
first_change_indices = []
for idx in filtered_df.index:
    # 找到所有在当前索引之后的变化点
    subsequent_changes = change_indices[change_indices > idx]
    if len(subsequent_changes) > 0:
        first_change_indices.append(subsequent_changes[0])
    else:
        # 若后续无变化,标记为NaN
        first_change_indices.append(np.nan)

# 获取对应的变化行数据
change_df = df.loc[first_change_indices].reset_index(drop=True)
filtered_df = filtered_df.reset_index(drop=True)

步骤4:合并数据并计算时间差

将筛选行和对应的首次变化行合并,计算两者的时间差:

# 合并两个DataFrame,添加后缀区分
result = pd.concat([filtered_df, change_df], axis=1, suffixes=('_filter', '_change'))
# 计算时间差(假设时间列名为Time)
result['Time_Difference'] = result['Time_change'] - result['Time_filter']

# 可根据需要保留关键列,比如:
result = result[['Time_filter', 'Col3_filter', 'Time_change', 'Col3_change', 'Time_Difference']]

补充优化说明

  • 如果时间列不是datetime类型,先转换:df['Time'] = pd.to_datetime(df['Time'])
  • 大数据量场景下,用numpy的searchsorted可快速定位首个后续变化点,提升效率:
# 优化版索引查找
first_change_indices = change_indices[np.searchsorted(change_indices, filtered_df.index, side='right')]
# 处理后续无变化的情况
first_change_indices[first_change_indices >= len(df)] = np.nan

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:42:56