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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:33:34