如何在Pandas DataFrame多列中筛选首字符为'd'的行
筛选Pandas DataFrame中指定列首字符均为'd'的行
需要筛选DataFrame中从第2列(columns[1:])起所有列值首字符均为'd'的行,示例DataFrame如下:
import pandas as pd df = pd.DataFrame({ 'name': ['vamjy', 'tjny', 'xrvwb', 'kuqjlat', 'muagny', 'cuw', 'ekw'], 'text': ['dadcd', 'abecc', 'dddda', 'ddade', 'eaedd', 'caceb', 'edded'], 'line': ['eebdd', 'abbcb', 'cbddd', 'dbeac', 'cabbd', 'acaca', 'ebace'], 'note': ['bdded', 'bbebb', 'adcca', 'decee', 'dbcce', 'eabbc', 'aaacc'] })
原可行但繁琐的写法
当列数较少时,可手动拼接布尔条件:
df[(df['text'].str[0]=='d') & (df['line'].str[0]=='d') & (df['note'].str[0]=='d')]
但列数较多时,这种写法重复冗余,需要更简洁的实现方式。
优化解决方案
方法1:向量化批量处理(推荐,效率更高)
直接对目标列批量提取首字符,生成布尔值矩阵后,按行判断是否全为True:
df[(df.iloc[:, 1:].str[0] == 'd').all(axis=1)]
df.iloc[:, 1:]:选取第2列及之后的所有列.str[0] == 'd':对每个列的所有值提取首字符,判断是否等于'd',得到布尔值DataFrame.all(axis=1):检查每行的所有布尔值是否全为True,返回行级的布尔序列,用于筛选行
方法2:逐行应用判断逻辑
使用apply逐行处理目标列,通过all()验证所有列的首字符条件:
df[df.iloc[:, 1:].apply(lambda row: all(str_val[0] == 'd' for str_val in row), axis=1)]
这种方法逻辑直观,但性能略低于向量化操作,适合需要自定义复杂判断逻辑的场景。
原尝试代码报错原因
你之前尝试的df[df[x].str[0] == 'd' for x in df.columns[1:]]无法运行,是因为Pandas的索引器无法直接识别生成器对象,需要将多个布尔序列合并为一个行级的布尔判断结果(如用&连接或all()合并)。
内容的提问来源于stack exchange,提问作者Tatiana
相关产品推荐
相关产品推荐

