如何在Pandas中按条件筛选指定行(含示例场景)
实现Pandas筛选目标行及其下一行的方法
当然有办法实现这个需求啦!针对你提到的场景,我整理了几种实用的Pandas操作方案,你可以根据自己的实际情况选择:
先准备测试用的DataFrame
首先咱们先把你给出的数据转换成Pandas DataFrame,方便后续操作:
import pandas as pd data = { 'Date': ['2018-04-08 13:40:00', '2018-04-08 13:41:00', '2018-04-08 13:42:00', '2018-04-08 13:43:00'], 'Value': [0.001, 5.000, 16.670, 18.670], 'PercentageDifference': [0.000000, 4999.000000, 2.334000, 0.119976] } df = pd.DataFrame(data) df['Date'] = pd.to_datetime(df['Date']) # 把日期列转为datetime类型,后续操作更灵活
方法一:布尔索引 + shift()(推荐,适配单/多个目标行)
这个方法通过标记目标行和它的下一行来筛选,逻辑清晰且通用性强:
# 生成筛选掩码:标记Value=0.001的行,以及它的下一行 mask = (df['Value'] == 0.001) | (df['Value'].shift(1) == 0.001) # 应用掩码得到结果 result = df[mask] print(result)
原理说明
df['Value'] == 0.001:直接定位到所有Value等于0.001的行df['Value'].shift(1) == 0.001:shift(1)会把上一行的Value值移到当前行,所以这个条件能定位到目标行的下一行- 用
|(或运算符)合并两个条件,就能同时选中目标行和它的下一行
方法二:索引定位(适合单目标行场景)
如果你的DataFrame里只有一个Value=0.001的行,可以直接通过索引来提取:
# 找到目标行的索引 target_idx = df[df['Value'] == 0.001].index[0] # 提取目标行和下一行 result = df.loc[[target_idx, target_idx + 1]] print(result)
注意:如果有多个目标行,这个方法需要循环处理每个索引,不如方法一高效。
方法三:numpy.roll(批量处理多目标行,避免边界误判)
如果你的DataFrame里有多个Value=0.001的行,且担心最后一行是目标行时出现误标记,可以用numpy的roll函数:
import numpy as np # 标记所有Value=0.001的行 target_rows = df['Value'] == 0.001 # 把标记数组向后滚动一位,定位到目标行的下一行 next_rows = np.roll(target_rows, 1) # 合并筛选条件 mask = target_rows | next_rows # 处理边界情况:如果最后一行是目标行,roll会把标记移到第一行,这里手动修正 if target_rows.iloc[-1]: mask.iloc[0] = False result = df[mask] print(result)
最终输出结果
不管用哪种方法,你都会得到想要的结果:
Date Value PercentageDifference 0 2018-04-08 13:40:00 0.001 0.0000 1 2018-04-08 13:41:00 5.000 4999.0000
内容的提问来源于stack exchange,提问作者Keithx
相关产品推荐
相关产品推荐

