如何用Pandas为临界值行匹配后续值达标的对应时间?
解决Pandas临界值行后续达标时间匹配问题
处理思路
- 准备数据集:加载或构造包含
time、value、is_critical的DataFrame,确保is_critical为布尔类型。 - 提取临界行:筛选出
is_critical为True的记录,作为处理的基础。 - 匹配后续达标时间:对每一行临界值,在其之后的行中找到第一个
value大于等于当前临界值的记录,提取对应的time。 - 整理结果:将匹配到的时间作为新列
return_to_critical,保留需要的三列输出。
完整代码实现
import pandas as pd # 构造数据集(如果数据来自本地CSV,替换为 df = pd.read_csv("你的文件路径.csv")) data = { 'time': ['0:00', '0:01', '0:02', '0:03', '0:04', '0:05', '0:06', '0:07', '0:08', '0:09', '0:10'], 'value': [1, 9, 2, 4, 6, 5, 1, 4, 8, 7, 10], 'is_critical': [False, True, False, False, True, False, False, False, True, False, False] } df = pd.DataFrame(data) # 筛选所有临界值行 critical_rows = df[df['is_critical']].reset_index(drop=True) # 初始化达标时间列 critical_rows['return_to_critical'] = None # 遍历每个临界行,查找后续首个达标记录 for idx, critical_row in critical_rows.iterrows(): # 获取当前临界行在原数据中的位置 current_index = df[df['time'] == critical_row['time']].index[0] # 筛选当前行之后、value >= 临界值的记录 matching_rows = df.loc[current_index + 1:][df['value'] >= critical_row['value']] # 如果找到匹配项,取第一个的时间 if not matching_rows.empty: critical_rows.loc[idx, 'return_to_critical'] = matching_rows.iloc[0]['time'] # 保留目标列并输出 result = critical_rows[['time', 'value', 'return_to_critical']] print(result)
代码说明
- 数据集准备:如果数据来自本地CSV,直接替换构造数据的代码为
pd.read_csv即可;构造数据的方式方便快速测试。 - 临界行筛选:通过布尔索引直接提取
is_critical为True的行,reset_index重置索引避免遍历出错。 - 后续匹配:通过
current_index定位当前临界行的位置,只查找current_index+1之后的行,确保是后续的记录;用布尔索引筛选达标行后,取第一个记录的time赋值给新列。 - 结果整理:只保留
time、value、return_to_critical三列,得到目标输出。
输出结果
执行代码后会生成与需求示例完全一致的结果:
time value return_to_critical 0 0:01 9 0:10 1 0:04 6 0:08 2 0:08 8 0:10
内容的提问来源于stack exchange,提问作者mwind
相关产品推荐
相关产品推荐

