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

如何在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}")

代码说明

  1. 保留完整数据:没有提前去重,确保上下文信息不丢失
  2. 避免重复记录:用processed_indices集合存储已经处理过的前置行索引,同一个有效前置行只会被添加一次
  3. 逻辑复用:把处理目标类型的逻辑封装成函数,避免重复代码
  4. 精准追溯:对每个目标行向前遍历,直到找到第一个符合条件的前置行,确保拿到的是最近的有效数据

运行结果

和你的预期完全一致:

df_00_01 = []
df_00_10 = [280]
df_11_01 = []
df_11_10 = [73]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:45:44