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

如何筛选DataFrame中指定列值为'13'的行及其前一行且避免重复

解决DataFrame筛选需求:保留目标行及其前一行并去重

我来帮你搞定这个DataFrame子集化的需求,用pandas可以很清晰地实现。核心思路是先定位所有time列等于13的行的索引,再把这些行的前一行索引也纳入范围,最后通过集合自动去重,确保没有重复行,同时保持原数据的顺序。

步骤1:构造示例DataFrame

首先我们先把你给出的示例数据转换成pandas DataFrame:

import pandas as pd

# 示例原始数据
data = {
    'ID': ['A', 'B', 'C', 'C', 'A', 'D', 'E'],
    'speed': [4, 7, 7, 8, 5, 6, 7],
    'dist': [12, 10, 18, 4, 6, 2, 2],
    'time': [4, 8, 13, 5, 13, 13, 9]
}

df = pd.DataFrame(data)

步骤2:定位目标索引并收集需保留的行

接下来我们找到所有time=13的行的索引,然后把这些索引和它们的前一行索引(如果存在的话)加入集合(集合会自动帮我们去重):

# 找到所有time等于13的行的索引
target_indices = df[df['time'] == 13].index

# 用集合来收集需要保留的索引,自动去重
selected_indices = set()
for idx in target_indices:
    # 加入目标行本身
    selected_indices.add(idx)
    # 如果不是第一行,加入前一行索引
    if idx > 0:
        selected_indices.add(idx - 1)

# 把集合转换成排序后的列表,保证原DataFrame的行顺序
selected_indices = sorted(selected_indices)

步骤3:提取最终结果

最后用loc方法提取这些索引对应的行:

result_df = df.loc[selected_indices]
print(result_df)

输出结果

运行后得到的结果正好符合你的预期:

ID  speed  dist  time
1  B      7    10     8
2  C      7    18    13
3  C      8     4     5
4  A      5     6    13
5  D      6     2    13

边界情况说明

  • 如果第一行就是time=13,代码会自动跳过前一行(因为idx>0的判断),不会报错;
  • 如果连续多行都是time=13,比如索引2和3都是13,集合会自动去重,不会重复包含索引2,确保每一行只出现一次。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:12:45