Pandas用str.contains筛选含'io'/'ir'列报错,求解决方案
解决Pandas筛选列时的
str.contains错误 错误原因分析
你遇到的type object 'str' has no attribute 'contains'错误,是因为直接调用了Python内置的str类的contains方法——但Python原生字符串根本没有这个方法!
Pandas中的字符串方法(比如contains)是专门针对Series/Index对象的,需要通过.str访问器来调用,比如对列名(df.columns是一个Index对象)使用df.columns.str.contains()。
正确实现方法
根据你的需求(保留列名含'io'或'ir'的列,以及index),这里提供几种可行的写法:
方法1:用Pandas字符串方法(推荐)
这种方法利用正则表达式的|表示“或”,通过列名的布尔索引筛选:
# 生成布尔索引:列名包含'io'或'ir',同时处理可能的空列名(na=False) filtered_cols = df1.columns.str.contains('io|ir', na=False) # 用.loc[:, ...]筛选列(如果index是行索引,会自动保留) df = df1.loc[:, filtered_cols]
如果你的index是一个单独的列(而非行索引),需要额外保留它的话,可以修改正则表达式,把index列也包含进来:
filtered_cols = df1.columns.str.contains('^index$|io|ir', na=False) df = df1.loc[:, filtered_cols]
方法2:列表推导式(更直观)
如果你不想用正则,直接判断列名是否包含指定子串:
# 先收集符合条件的列名 target_cols = [col for col in df1.columns if 'io' in col or 'ir' in col] # 如果需要保留index列,就把它加到列表开头 target_cols = ['index'] + target_cols # 筛选列 df = df1[target_cols]
方法3:优化索引方式
你原来用的df[:, ...]是NumPy的索引风格,在Pandas中虽然兼容,但更推荐使用.loc[:, 列条件]或者直接传入列名列表的方式,代码可读性更强。
验证结果
用你给出的示例数据集测试,以上方法都会得到包含index(如果是列)、aio、bir的新DataFrame,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

