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

序列模式识别提取:DataFrame中ERROR相邻名称与对应ID捕获需求

实现方案(Python + Pandas)

核心逻辑说明

  • 先给所有连续的相同值(含ERROR和正常名称)分配相同的块ID,把连续ERROR合并为同一个块
  • 对每个ERROR块,取块内最后一行的ID作为代表
  • 分别匹配当前ERROR块之前最后一个非ERROR块的名称、之后第一个非ERROR块的名称,缺失时用NA填充
  • 拼接两个名称得到最终的NAMES列

完整代码

import pandas as pd

def process_error_df(df):
    # 1. 生成连续块ID,相同连续值分配同一个ID
    df['block_id'] = (df['NAMES'] != df['NAMES'].shift()).cumsum()
    # 2. 提取所有块的汇总信息:块ID、块类型(是否ERROR)、块最后一个ID、块的名称
    block_info = df.groupby('block_id').agg(
        is_error=('NAMES', lambda x: x.iloc[0] == 'ERROR'),
        last_id=('ID', 'last'),
        name=('NAMES', 'first')
    ).reset_index()
    # 3. 提取所有ERROR块
    error_blocks = block_info[block_info['is_error']]
    # 4. 为每个ERROR块匹配前后的非ERROR名称
    result = []
    # 遍历每个ERROR块
    for idx, row in error_blocks.iterrows():
        # 找前面最后一个非ERROR名称
        prev_names = block_info[(block_info['block_id'] < row['block_id']) & (~block_info['is_error'])]['name']
        prev_name = prev_names.iloc[-1] if len(prev_names) > 0 else 'NA'
        # 找后面第一个非ERROR名称
        next_names = block_info[(block_info['block_id'] > row['block_id']) & (~block_info['is_error'])]['name']
        next_name = next_names.iloc[0] if len(next_names) > 0 else 'NA'
        # 拼接结果
        result.append({
            'ID': row['last_id'],
            'NAMES': f"{prev_name}-{next_name}"
        })
    return pd.DataFrame(result)

# ------------------- 测试用例 -------------------
# 测试示例1
df1 = pd.DataFrame({
    'ID': [1,3,6,88,53,55,7,834],
    'NAMES': ['James','ERROR','Keras','Kelly','Micheal','ERROR','Cindy','Keras']
})
print("示例1输出:")
print(process_error_df(df1))

# 测试示例2
df2 = pd.DataFrame({
    'ID': [1,3,6,88,53,55,7,834],
    'NAMES': ['James','ERROR','ERROR','ERROR','Jude','ERROR','Cindy','Keras']
})
print("\n示例2输出:")
print(process_error_df(df2))

输出验证

示例1输出结果

IDNAMES
3James-Keras
55Micheal-Cindy

示例2输出结果

IDNAMES
88James-Jude
55Jude-Cindy

边界场景支持

  • ERROR在首行:前面名称自动补NA,比如首行是ERROR块,输出NA-xxx
  • ERROR在末行:后面名称自动补NA,比如末行是ERROR块,输出xxx-NA
  • 全表都是ERROR:输出为ID=最后一行ID, NAMES=NA-NA

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:36:01