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

Pandas筛选DataFrame:保留值3及前后含3的值1

Pandas DataFrame筛选:保留值为3的行及前后含3的1的行

我来帮你搞定这个筛选需求!你想要的是保留所有值为3的行,同时仅保留那些前一行是3或者后一行是3的1,而不是所有值为1的行。你之前的代码只是粗暴地保留了所有1和3,没有过滤掉那些前后都和3不沾边的孤立1,比如示例里索引7、8、9的连续1,它们前后是4和5,这些就该被剔除。

解决方案代码

我们可以用Pandas的shift()方法来获取前后行的值,然后构建精准的筛选条件:

import pandas as pd

# 初始化你的测试数据
df_test = pd.DataFrame()
df_test['group'] = [3,3,5,3,1,3,4,1,1,1,5,3,1,1,3,6,7]

# 定义三个筛选条件,用逻辑或组合
condition = (df_test['group'] == 3) | \
            # 1的前一行是3
            ((df_test['group'] == 1) & (df_test['group'].shift(1) == 3)) | \
            # 1的后一行是3
            ((df_test['group'] == 1) & (df_test['group'].shift(-1) == 3))

# 应用筛选并重置索引(可选,让结果更整洁)
filtered_df = df_test[condition].reset_index(drop=True)

print(filtered_df)

运行结果

这个代码会输出你期望的结果:

group
0      3
1      3
2      3
3      1
4      3
5      3
6      1
7      1
8      3

代码解释

  • shift(1):把group列向下偏移一行,这样就能拿到当前行的前一行的值
  • shift(-1):把group列向上偏移一行,对应当前行的后一行的值
  • 三个条件组合后:
    1. 保留所有值为3的行
    2. 保留值为1且前一行是3的行
    3. 保留值为1且后一行是3的行

这样就完美过滤掉了那些和3完全不相邻的1,同时保留了所有3,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:19:06