使用Pandas遇TypeError:slice indices需为整数/None或含__index__方法
解决 TypeError: slice indices must be integers... 的问题
让我们一步步排查你的问题:
1. 弃用的 ix 索引器是首要问题
df.ix 在 pandas 1.0 版本就已经被完全弃用了,它的混合索引行为(同时支持位置和标签索引)经常会导致难以预料的错误,尤其是当你的列标签不是整数时。你应该用 iloc(纯位置索引)来替代它,因为你这里是按位置选取第1到28列:
# 替换弃用的 ix 为 iloc v_features = df.iloc[:, 1:29].columns
2. 链式索引可能引发的隐性问题
你的代码中使用了链式索引 df[cn][df.Class == 1],这种写法可能会返回数据的副本而非视图,在某些情况下会导致索引混乱。推荐使用 loc 进行明确的行/列索引,这样更安全且可读性更好:
for i, cn in enumerate(v_features): # 直接遍历v_features即可,无需遍历df[v_features] # 使用loc选取Class=1的行和当前特征列 sns.distplot(df.loc[df.Class == 1, cn], bins=50) sns.distplot(df.loc[df.Class == 0, cn], bins=50)
另外,你不需要遍历 df[v_features],直接遍历 v_features 这个列名数组就足够了,这样代码更简洁。
3. 额外检查项
如果上面的修改后仍然报错,建议你做以下检查:
- 确认
df.Class列的数据类型是整数(int)或布尔值,而不是字符串或浮点数。如果是字符串,需要改成整数:df['Class'] = df['Class'].astype(int) - 确认所有特征列(V1到V28)都是数值型(
float或int),没有字符串类型的数据。可以用df[v_features].dtypes查看每列的数据类型,如果有非数值列,需要做类型转换或处理。
这些修改应该能解决你遇到的切片索引错误,同时让代码更符合 pandas 的最佳实践。
内容的提问来源于stack exchange,提问作者HISI
相关产品推荐
相关产品推荐

