Python处理百万行DataFrame:识别时间序列值突破50的行并生成新表
解决百万行DataFrame中时间序列突破阈值的问题
别用循环!百万行数据用循环跑起来慢到离谱,用pandas的矢量化操作才是正确姿势——高效又简洁。
核心思路
要找「当前值>50且前一值≤50」的行,关键是用shift()函数把前一行的Value拉到当前行做对比,完全不用手动遍历每一行。
具体步骤&代码
- 先确保数据严格按时间排序(你已经做了这步,加个索引重置避免后续出问题):
test = test_df.sort_values(by=['Time', 'Value']).reset_index(drop=True)
- 生成判断条件并筛选:
- 用
test['Value'].shift(1)获取前一行的数值 - 同时满足「当前值>50」和「前一值≤50」两个条件
- 自动排除第一行(因为第一行没有前一行,
shift(1)会返回NaN,不会被选中)
# 构建筛选条件 condition = (test['Value'] > 50) & (test['Value'].shift(1) <= 50) # 得到符合条件的新DataFrame filtered_df = test[condition].copy()
- 现在
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
相关产品推荐
相关产品推荐

