如何用Python或Pandas统计跳过首个区块的指定字符块长度
Pandas字符块长度统计实现方案
问题描述
现有如下示例DataFrame:
| 索引 | col1 内容 |
|---|---|
| index0 | '......kkkkkkk......kkkkkkkkk.....kkkkkkkkkkkk' |
| index1 | '......kkkkkkkkk.........kkkkkkk.......kkkkkkkk...' |
需要完成以下统计需求:
- 跳过每行的首个字符区块
- 统计每行中第一个'k'连续字符块的长度(如index0为7、index1为9)
- 统计每行中第二个'.'连续字符块的长度(如index0为6、index1为9)
最终预期结果:
| 索引 | 1st block of 'k' | 2nd block of '.' |
|---|---|---|
| index0 | 7 | 6 |
| index1 | 9 | 9 |
实现代码
我们可以利用正则表达式匹配连续字符块,结合Pandas的apply方法完成统计:
import pandas as pd import re # 构造示例DataFrame df = pd.DataFrame( {'col1': [ '......kkkkkkk......kkkkkkkkk.....kkkkkkkkkkkk', '......kkkkkkkkk.........kkkkkkk.......kkkkkkkk...' ]}, index=['index0', 'index1'] ) # 定义单行文本处理函数 def calculate_block_lengths(text): # 匹配所有连续相同字符的区块,返回(完整区块, 单个字符)的列表 all_blocks = re.findall(r'((.)\2*)', text) # 跳过首个区块,取后续待处理区块 target_blocks = all_blocks[1:] # 提取第一个'k'区块的长度 first_k_length = 0 for block, char in target_blocks: if char == 'k': first_k_length = len(block) break # 提取第二个'.'区块的长度 dot_counter = 0 second_dot_length = 0 for block, char in target_blocks: if char == '.': dot_counter += 1 if dot_counter == 2: second_dot_length = len(block) break return pd.Series( [first_k_length, second_dot_length], index=["1st block of 'k'", "2nd block of '.'"] ) # 应用函数到每行数据,生成结果DataFrame result_df = df['col1'].apply(calculate_block_lengths) print(result_df)
代码说明
- 正则匹配逻辑:
re.findall(r'((.)\2*)', text)会将字符串分割为连续相同字符的区块,例如'......kkkkkkk'会被拆分为[('......', '.'), ('kkkkkkk', 'k')] - 跳过首个区块:通过
target_blocks = all_blocks[1:]直接舍弃第一组字符块,满足需求要求 - 区块筛选:遍历剩余区块,分别定位到第一个'k'块和第二个'.'块,提取它们的长度
- 结果整合:用
apply将处理函数映射到每行,最终生成符合要求的结果DataFrame
运行代码后输出结果与预期完全一致:
1st block of 'k' 2nd block of '.' index0 7 6 index1 9 9
内容的提问来源于stack exchange,提问作者888Seeme
相关产品推荐
相关产品推荐

