如何在Python DataFrame中查找指定comm_type值的前一个符合条件行
解决思路与代码实现
我来帮你搞定这个问题!你的核心需求是:找到所有comm_type为'00'(以及'11')的行,然后定位它们**前一个非'00'、非'11'**的comm_type对应的packet_length,并且按前置类型分类到不同列表,同时避免重复记录同一个前置行的数据对吧?
先分析你之前代码的问题
你之前先去除了连续重复的行,这会直接丢失上下文信息——比如多个连续'00'行本来对应同一个有效前置行,但去重后可能跳过了关键的前置索引,导致逻辑出错。正确的思路应该是保留完整数据,针对每个目标行向前追溯第一个符合条件的前置行,同时用集合记录已处理的前置索引避免重复。
完整解决方案代码
首先我们先构造示例DataFrame方便测试(你实际使用时替换成读取db.csv的代码即可):
import pandas as pd # 构造你的示例数据 data = { 'packet_length': [280, 105, 105, 105, 127, 127, 127, 583, 1066, 73, 278], 'src_port': [46306.0, 33105.0, 33105.0, 33105.0, 9999.0, 9999.0, 9999.0, 45914.0, 443.0, 46306.0, 46306.0], 'dst_port': [443.0, 9999.0, 9999.0, 9999.0, 33105.0, 33105.0, 33105.0, 443.0, 46306.0, 443.0, 443.0], 'comm_type': ['10', '00', '00', '00', '00', '00', '00', '01', '10', '10', '11'] } df = pd.DataFrame(data) # 初始化结果列表 df_00_01 = [] df_00_10 = [] df_11_01 = [] df_11_10 = [] # 用集合记录已经处理过的前置行索引,避免重复添加同一个行的packet_length processed_indices = set() # 处理comm_type为'00'的情况 def process_target_type(target_type, list_01, list_10): target_indices = df[df['comm_type'] == target_type].index for idx in target_indices: prev_idx = idx - 1 # 向前遍历,找到第一个非'00'、非'11'的行 while prev_idx >= 0: prev_comm = df.loc[prev_idx, 'comm_type'] if prev_comm not in {'00', '11'}: if prev_idx not in processed_indices: pkt_len = df.loc[prev_idx, 'packet_length'] if prev_comm == '10': list_10.append(pkt_len) elif prev_comm == '01': list_01.append(pkt_len) processed_indices.add(prev_idx) # 找到第一个符合条件的就停止,因为连续的target行对应同一个前置 break prev_idx -= 1 # 调用函数处理两种目标类型 process_target_type('00', df_00_01, df_00_10) process_target_type('11', df_11_01, df_11_10) # 输出结果 print(f"df_00_01 = {df_00_01}") print(f"df_00_10 = {df_00_10}") print(f"df_11_01 = {df_11_01}") print(f"df_11_10 = {df_11_10}")
代码说明
- 保留完整数据:没有提前去重,确保上下文信息不丢失
- 避免重复记录:用
processed_indices集合存储已经处理过的前置行索引,同一个有效前置行只会被添加一次 - 逻辑复用:把处理目标类型的逻辑封装成函数,避免重复代码
- 精准追溯:对每个目标行向前遍历,直到找到第一个符合条件的前置行,确保拿到的是最近的有效数据
运行结果
和你的预期完全一致:
df_00_01 = [] df_00_10 = [280] df_11_01 = [] df_11_10 = [73]
内容的提问来源于stack exchange,提问作者sooaran
相关产品推荐
相关产品推荐

