如何按顺序统计连续/单独的4.xxx/5.xxx值出现次数并获取索引
解决方案
核心思路
放弃正则处理连续序列的思路,转而通过行状态对比+分组统计的方式,精准识别连续/单独出现的目标值块,同时直接获取每个块的索引范围与出现顺序,满足后续索引使用需求。
具体实现(以Python pandas为例)
假设你的数据存储在DataFrame的某一列中,以下是可直接复用的代码:
1. 准备示例数据&标记符合条件的行
import pandas as pd # 模拟你的目标列数据(示例中应统计为3次) df = pd.DataFrame({ 'target_col': ['1.2', '4.004', '4.005', '3.1', '5.066', '2.7', '4.1', '5.2', '5.3'] }) # 生成布尔掩码:标记以"4."或"5."开头的元素(转为字符串处理适配数值/字符串类型) mask = df['target_col'].astype(str).str.startswith(('4.', '5.'))
2. 识别连续块并分配唯一ID
通过对比当前行与上一行的掩码状态,定位每个连续块的起始点,再为每个块分配ID实现分组:
# 定位每个连续符合条件块的起始行 block_starts = mask & ~mask.shift(fill_value=False) # 为每个块分配唯一ID,不符合条件的行设为None df['block_id'] = block_starts.cumsum() df['block_id'] = df['block_id'].where(mask, other=None)
3. 提取块信息与顺序索引
按块ID分组后,直接获取每个块的索引范围、包含值,以及首次/二次/末次块的信息:
# 统计每个块的核心信息 block_summary = df.groupby('block_id')['target_col'].agg( start_index=lambda x: x.index.min(), end_index=lambda x: x.index.max(), included_values=list ).reset_index() # 总出现次数 total_blocks = len(block_summary) print(f"总出现次数:{total_blocks}") # 获取指定顺序的块索引范围 first_block = block_summary.iloc[0][['start_index', 'end_index']] second_block = block_summary.iloc[1][['start_index', 'end_index']] if total_blocks >=2 else None last_block = block_summary.iloc[-1][['start_index', 'end_index']] print("首次出现索引范围:", first_block.to_dict()) print("二次出现索引范围:", second_block.to_dict() if second_block else "无") print("末次出现索引范围:", last_block.to_dict())
关键优势
- 规避正则无法处理行级连续序列的缺陷,逻辑直接易懂;
- 输出的
block_summary包含所有块的完整信息,可直接作为后续操作的索引数据源; - 适配数值、字符串等多种列类型,无需额外格式转换。
内容的提问来源于stack exchange,提问作者Ren Tremendous
相关产品推荐
相关产品推荐

