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

如何提取某列中连续重复指定值超4次的行并分组(附示例)

提取连续重复值超指定次数的行并分组

需求说明

从数据表中筛选出指定列(示例为C列)内连续重复指定值(示例为1)超过4次的连续行,并为每一组符合条件的连续行分配唯一分组编号。

示例数据

A   B          C 
10  john       1
12  paul       1
23  kishan     1
12  teja       1
12  zebo       1
324 vauh       -1
3434    krish  -1
232 poo        -1
4535    zoo    1
4343    doo    1
342 foo        -1
123 soo        1
121 koo        -1
34  loo        -1
343454  moo    -1
565343  noo    -1
2323234 voo    -1
3434    coo    1
545 xoo        1
6565    zoo    1
232321  qoo    1
34454   woo    1
546556  eoo    1
65665   roo    -1
5343    too    -1
3232    yoo    1
1212    uoo    1
23355667    ioo 1
787878  joo    -1

预期输出

A       B          C  group
10      john       1      1
12      paul       1      1
23      kishan     1      1
12      teja       1      1
12      zebo       1      1
3434    coo        1      2
545     xoo        1      2
6565    zoo        1      2
232321  qoo        1      2
34454   woo        1      2
546556  eoo        1      2

实现方案(Python pandas)

以下是基于pandas的代码实现,逻辑清晰可复用:

import pandas as pd

# 构造示例数据(实际场景可替换为pd.read_csv等读取文件的逻辑)
data = [
    [10, 'john', 1], [12, 'paul', 1], [23, 'kishan', 1], [12, 'teja', 1], [12, 'zebo', 1],
    [324, 'vauh', -1], [3434, 'krish', -1], [232, 'poo', -1], [4535, 'zoo', 1], [4343, 'doo', 1],
    [342, 'foo', -1], [123, 'soo', 1], [121, 'koo', -1], [34, 'loo', -1], [343454, 'moo', -1],
    [565343, 'noo', -1], [2323234, 'voo', -1], [3434, 'coo', 1], [545, 'xoo', 1], [6565, 'zoo', 1],
    [232321, 'qoo', 1], [34454, 'woo', 1], [546556, 'eoo', 1], [65665, 'roo', -1], [5343, 'too', -1],
    [3232, 'yoo', 1], [1212, 'uoo', 1], [23355667, 'ioo', 1], [787878, 'joo', -1]
]
df = pd.DataFrame(data, columns=['A', 'B', 'C'])

# 1. 标记每个连续相同值的独立块
df['block_id'] = df['C'].ne(df['C'].shift()).cumsum()

# 2. 统计每个块的行数和对应值
block_stats = df.groupby('block_id').agg(
    count=('C', 'size'),
    value=('C', 'first')
).reset_index()

# 3. 筛选出符合条件的块(值为1且行数>4)
valid_blocks = block_stats[(block_stats['value'] == 1) & (block_stats['count'] > 4)]['block_id']

# 4. 过滤原数据,仅保留有效块的行
result = df[df['block_id'].isin(valid_blocks)].copy()

# 5. 生成连续的分组编号
result['group'] = result['block_id'].rank(method='dense').astype(int)

# 6. 整理输出格式,移除临时列
result = result[['A', 'B', 'C', 'group']]

# 打印结果
print(result.to_string(index=False))

代码逻辑说明

  1. 标记连续块:通过ne()对比当前行与上一行的C列值,cumsum()累加生成唯一块ID,确保相同连续值的行归属同一块。
  2. 统计块信息:分组计算每个块的行数和对应值,为后续筛选提供依据。
  3. 筛选有效块:只保留值为1且行数超过4的块ID。
  4. 过滤目标行:从原数据中提取属于有效块的记录。
  5. 生成分组号:对有效块ID进行稠密排名,得到从1开始的连续分组编号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:27:47