基于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
相关产品推荐
相关产品推荐

