如何基于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
相关产品推荐
相关产品推荐

