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

如何在Python中高效筛选DataFrame特定行并拆分两个子DataFrame

嗨,我猜你可能笔误啦——看你举的例子,实际是要判断每行的y_cor是否大于前后行的y_cor(第三行的41比前一行17和后一行39都大),而不是x_cor~下面给你一个高效的矢量化解法,完全不用循环,比iloc循环快N倍:

核心思路:用pandas的shift()做矢量化比较

pandas的shift()函数可以快速获取前一行/后一行的数据,结合布尔运算生成筛选掩码,这是最符合pandas风格的高效解法,底层是C实现的,处理大数据集时优势特别明显。

完整代码示例

首先先把你的数据重建为DataFrame(方便测试):

import pandas as pd

data = {
    'x_cor': [893.200012, 893.299988, 893.400024, 893.500000, 893.599976, 893.700012,
              893.799988, 893.900024, 894.000000, 894.099976, 894.200012, 894.299988,
              894.400024, 894.500000, 894.599976, 894.700012],
    'y_cor': [1, 17, 41, 39, 40, 36, 2, 13, 44, 43, 74, 88, 78, 132, 180, 178]
}
df = pd.DataFrame(data)

然后生成筛选掩码并拆分DataFrame:

# 生成布尔掩码:当前行y_cor > 前一行y_cor 且 当前行y_cor > 后一行y_cor
# shift(1)是取前一行,shift(-1)是取后一行,首尾行因为没有前后行,会自动返回NaN,布尔比较后为False
mask = (df['y_cor'] > df['y_cor'].shift(1)) & (df['y_cor'] > df['y_cor'].shift(-1))

# 拆分出两个DataFrame
peak_rows = df[mask]  # 满足条件的峰值行
non_peak_rows = df[~mask]  # 不满足条件的行

结果验证

运行后peak_rows会包含这几行(都是y_cor的峰值):

x_cory_cor
893.40002441
894.29998888
894.599976180

而non_peak_rows则包含剩下的所有行,完全符合你的需求~

这种方法的优势在于:

  • 完全避免了Python循环,利用pandas的矢量化操作提升效率,数据量越大越明显
  • 代码简洁易读,逻辑清晰,后期维护成本低

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:34:18