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

Python处理百万行DataFrame:识别时间序列值突破50的行并生成新表

解决百万行DataFrame中时间序列突破阈值的问题

别用循环!百万行数据用循环跑起来慢到离谱,用pandas的矢量化操作才是正确姿势——高效又简洁。

核心思路

要找「当前值>50且前一值≤50」的行,关键是用shift()函数把前一行的Value拉到当前行做对比,完全不用手动遍历每一行。

具体步骤&代码

  1. 先确保数据严格按时间排序(你已经做了这步,加个索引重置避免后续出问题):
test = test_df.sort_values(by=['Time', 'Value']).reset_index(drop=True)
  1. 生成判断条件并筛选:
  • 用test['Value'].shift(1)获取前一行的数值
  • 同时满足「当前值>50」和「前一值≤50」两个条件
  • 自动排除第一行(因为第一行没有前一行,shift(1)会返回NaN,不会被选中)
# 构建筛选条件
condition = (test['Value'] > 50) & (test['Value'].shift(1) <= 50)
# 得到符合条件的新DataFrame
filtered_df = test[condition].copy()
  1. 现在filtered_df就是所有从≤50突破到>50的时间点对应的行。

为什么不用循环?

百万行数据用for循环逐行判断,速度会慢几十甚至上百倍。pandas的矢量化操作是底层优化过的,处理大数据集的效率碾压手动循环。

补充:多分组场景

如果你的数据是按不同维度(比如ID)分组的时间序列,只需加个groupby就行:

# 假设按'ID'分组,每个组内找突破点
test = test_df.sort_values(by=['ID', 'Time', 'Value']).reset_index(drop=True)
condition = (test['Value'] > 50) & (test.groupby('ID')['Value'].shift(1) <= 50)
filtered_df = test[condition].copy()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:35:57