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

如何按顺序统计连续/单独的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:42:16