如何按value=100条件切分pandas DataFrame并批量绘制切片图
你之前写的df[df['value'] <= 100]得不到预期结果的原因很简单:你提供的数据集里value列的最大值就是100,这个筛选条件等同于保留所有行,自然和原表完全一致。
切分数据的实现方法
核心流程是先定位所有满足value == 100的行位置,再按照这些位置把原表拆成连续的数据块,不需要逐行写循环判断:
- 定位切分触发点
用你提供的示例数据集运行这段代码,会返回切分标记# 取出所有value等于100的行索引,作为切分标记 trigger_idx = df.index[df['value'] == 100].tolist()[4, 8, 10],对应原表中第4、8、10行的位置,也就是value=100出现的位置。 - 按标记拆分数据
用numpy的split方法可以直接按照给定的索引位置拆分DataFrame:
对你的示例数据集,切分后会得到4个独立的数据块:import numpy as np # 按照触发位置切分原表 raw_slices = np.split(df, trigger_idx) # 过滤切分产生的空块(通常是连续出现两个value=100的情况才会生成空块) slices = [slice_df for slice_df in raw_slices if len(slice_df) > 0]- 原表第0-3行:time=[4,10,15,6], value=[0,0,0,50]
- 原表第4-7行:time=[0,20,40,11], value=[100,0,0,70]
- 原表第8-9行:time=[9,12], value=[100,0]
- 原表第10-11行:time=[11,25], value=[100,20]
适合存储切片的最优数据结构
列表嵌套独立DataFrame 是最适配后续绘图操作的存储结构,优势很明确:
- 每个切片完整保留原表的列结构(time、value),后续绘图、计算时直接按列名取数就行,和操作单张表的逻辑完全一致,没有额外适配成本
- 列表的有序性天然匹配切分的先后顺序,不需要手动给每个切片编序号,遍历处理时天然按切分顺序执行
- 不存在不同切片长度不一致的兼容问题,相比“把所有切片存在一张大表、加切片标识列”的方案,不会因为短切片填充无意义的空值,绘图时也不会出现多余的断点
后续绘图的操作示例
切片存在列表里后,直接循环遍历列表,就能把所有切片绘制在同一张图中:
import matplotlib.pyplot as plt plt.figure(figsize=(10, 6)) for slice_id, slice_data in enumerate(slices): plt.plot(slice_data['time'], slice_data['value'], marker='o', label=f'第{slice_id+1}个切片') plt.xlabel('time') plt.ylabel('value') plt.legend() plt.show()
如果你的切分规则不是“取两个相邻触发点之间的全部数据”,而是“从每个value=100的位置开始,往后取固定长度的数据作为切片”,只需要把上面的切分逻辑改成循环每个触发索引、按固定长度截取行,同样存在这个列表里就行,后续绘图的逻辑完全不需要调整。
内容的提问来源于stack exchange,提问作者fdaa Cham
相关产品推荐
相关产品推荐

