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

基于Pandas DataFrame的字符块统计与条件计算问题

Pandas字符块统计与过滤问题解决方案

原始DataFrame定义

import pandas as pd
import re

please = pd.DataFrame({'name':['kitty', 'bake','kitty','bake'], 
                      'level' : ['12', '12', '15', '15'],
                      'col1':['......kkkkkkk......kkkkkkkkkkk.....kkkkkkkkkkkk', '......kkkkkkkkk.........kkkkkkk.......kkkkkkkk...', 'kkkk....kkkkkk....kkkkkkkkkkk......','kkkkkkk...kkkkkkkk.k.kkkkkkkkkk........kk']})   

原始DataFrame结构

name level                                               col1
0  kitty    12      ......kkkkkkk......kkkkkkkkkkk.....kkkkkkkkkkkk
1   bake    12  ......kkkkkkkkk.........kkkkkkk.......kkkkkkkk...
2  kitty    15                kkkk....kkkkkk....kkkkkkkkkkk......
3   bake    15               kkkkkkk...kkkkkkkk.k.kkkkkkkkkk........kk

问题1:统计每行col1中连续'k'字符块的长度列表

用正则匹配所有连续的'k'片段,提取每个片段的长度并生成新列:

# 提取连续k块的长度列表
def get_k_block_lengths(s):
    k_blocks = re.findall(r'k+', s)
    return [len(block) for block in k_blocks]

please['k_block_lengths'] = please['col1'].apply(get_k_block_lengths)

查看bake_15对应的结果:

print(please.loc[3, 'k_block_lengths'])

输出:[7,8,1,10,2]


问题2:过滤列表中小于5的数值

对生成的k块长度列表进行过滤,保留长度≥5的元素:

# 过滤函数
def filter_blocks(lst):
    return [x for x in lst if x >= 5]

please['k_block_lengths_filtered'] = please['k_block_lengths'].apply(filter_blocks)

查看bake_15过滤后的结果:

print(please.loc[3, 'k_block_lengths_filtered'])

输出:[7,8,10]


问题3:按条件提取指定位置的字符块长度

获取kitty_level_12的第2个'k'字符块长度

定位目标行后,直接提取对应k块的第2个元素(列表索引从0开始):

kitty_12_row = please[(please['name'] == 'kitty') & (please['level'] == '12')].iloc[0]
kitty_12_2nd_k = kitty_12_row['k_block_lengths'][1]
print(f"kitty_level_12_2nd 'k' block = {kitty_12_2nd_k}")

输出:kitty_level_12_2nd 'k' block = 11

获取bake_level_12的第2个'.'字符块长度

先定义提取连续'.'块长度的函数,再定位目标行提取对应元素:

# 提取连续.块长度的函数
def get_dot_block_lengths(s):
    dot_blocks = re.findall(r'\.+', s)
    return [len(block) for block in dot_blocks]

bake_12_row = please[(please['name'] == 'bake') & (please['level'] == '12')].iloc[0]
bake_12_2nd_dot = get_dot_block_lengths(bake_12_row['col1'])[1]
print(f"bake_level_12_2nd '.' block = {bake_12_2nd_dot}")

输出:bake_level_12_2nd '.' block = 9


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 01:27:30