如何提取某列中连续重复指定值超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))
代码逻辑说明
- 标记连续块:通过
ne()对比当前行与上一行的C列值,cumsum()累加生成唯一块ID,确保相同连续值的行归属同一块。 - 统计块信息:分组计算每个块的行数和对应值,为后续筛选提供依据。
- 筛选有效块:只保留值为1且行数超过4的块ID。
- 过滤目标行:从原数据中提取属于有效块的记录。
- 生成分组号:对有效块ID进行稠密排名,得到从1开始的连续分组编号。
内容的提问来源于stack exchange,提问作者pylearner
相关产品推荐
相关产品推荐

