Python Pandas如何根据列字符串指定位置的字母过滤行数据
Pandas基于字符串列指定位置字符筛选行的实现方法
原代码存在的问题
- 字符串索引语法错误:Python字符串没有
.index[1]的用法,.index()是用来查找子串位置的方法,取指定位置字符的正确写法是字符串[位置值] - 逻辑偏差:原代码的判断分支内执行的是打印全表操作,即便条件匹配,也不会只输出符合要求的行;同时循环过程没有记录匹配行的索引,没法精准定位目标行
- 语法错误:
print语句没有正确缩进,即便循环内的判断成立,代码也不会执行对应逻辑
推荐实现:向量化无循环写法
这是Pandas处理字符串列的标准范式,执行效率远高于手动写循环,尤其适合数据量较大的场景,参考代码:
import pandas as pd df = pd.read_excel(r'C:\Users\Name\Desktop\pokemon.xlsx') # 批量判断Name列第二位(索引从0开始)是否为'h',筛选匹配行 filtered_df = df[df['Name'].str[1] == 'h'] print(filtered_df)
关键逻辑说明:
- 借助Pandas内置的
.str访问器,可以对整列所有字符串元素批量执行切片、取字符操作,和单条Python字符串的操作逻辑完全一致 - 字符串索引默认从0开始计数,需求中的“第二位字符”对应索引值为1,因此用
df['Name'].str[1]就能批量提取每一行Name列对应位置的字符 - 判断后生成的布尔型Series传入DataFrame的索引位置,即可直接筛选出符合条件的整行数据,对示例表执行后会直接返回Charizard对应的行
循环版本的修正写法
如果需要通过遍历实现逻辑,修正后的可运行代码如下:
import pandas as pd df = pd.read_excel(r'C:\Users\Name\Desktop\pokemon.xlsx') matched_index = [] # 遍历过程同时获取行索引和对应的Name值 for row_idx, name in df['Name'].items(): # 先校验字符串长度和类型,避免遇到空值、短字符串时报索引越界错误 if isinstance(name, str) and len(name) > 1 and name[1] == 'h': matched_index.append(row_idx) # 批量取出所有匹配行 filtered_df = df.loc[matched_index] print(filtered_df)
注意:写循环遍历处理Pandas列时,尽量不要在循环内反复对原表做修改或打印操作,提前收集匹配的索引值、最后统一取数,能大幅提升执行效率。
内容的提问来源于stack exchange,提问作者Ved Brahmbhatt
相关产品推荐
相关产品推荐

