如何筛选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
相关产品推荐
相关产品推荐

