序列模式识别提取: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输出结果
| ID | NAMES |
|---|---|
| 3 | James-Keras |
| 55 | Micheal-Cindy |
示例2输出结果
| ID | NAMES |
|---|---|
| 88 | James-Jude |
| 55 | Jude-Cindy |
边界场景支持
- ERROR在首行:前面名称自动补NA,比如首行是ERROR块,输出
NA-xxx - ERROR在末行:后面名称自动补NA,比如末行是ERROR块,输出
xxx-NA - 全表都是ERROR:输出为
ID=最后一行ID, NAMES=NA-NA
内容的提问来源于stack exchange,提问作者R_Student
相关产品推荐
相关产品推荐

