我无法理解为什么代码中存在此错误。昨天,它工作得非常好,我得到了正确的结果。
for j in range(column): #Column is the number of columns in the dataframe 'traindata'
if np.all(traindata.iloc[:, j] == 0): #Compare all values in a column to 0
traindata = traindata.drop(traindata.columns[j], axis=1, inplace=True)
print(traindata.shape)
错误是:
AttributeError: 'NoneType' object has no attribute 'iloc'.
我试图寻找问题所在,但没有找到正确的答案
答案 0 :(得分:0)
这是完整的代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
from sklearn.model_selection import train_test_split
from sklearn.model_selection import learning_curve
from sklearn.model_selection import validation_curve
from sklearn.model_selection import cross_val_score
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
traindata = pd.read_csv('santandertrain.csv')
traindata_copy = traindata.copy()
traindata = pd.DataFrame(traindata)
print(traindata.shape)
[row, column] = traindata.shape
# testdata = pd.read_csv('santandertest.csv')
# testdata_copy = testdata.copy()
# print(testdata.shape) # (49342, 4992)
# print(traindata.describe().T)
# print(traindata.isnull().sum()) There are no NA values
for j in range(column):
if np.all((traindata.iloc[:, j]) == 0):
traindata = traindata.drop(traindata.columns[j], axis=1, inplace=True)
print(traindata.shape)
当我在下面运行此代码时,.iloc可以完美地配合训练数据
print(traindata.iloc[1:10, 0:5])
答案 1 :(得分:0)
问题出在:traindata = traindata.drop(traindata.columns[j], axis=1, inplace=True)
。您可以通过添加一行代码print(traindata)
来检查traindata的值,之后它会返回'None'。
您可以更改为:
traindata.drop(traindata.columns[j], axis=1, inplace=True)
但是,由于不断删除列,您可能会收到新错误(IndexError:单个位置索引器超出范围)。
答案 2 :(得分:0)
我在 Jupyter 笔记本中遇到了类似的问题:
df = df.drop(['B1','C1','D2','E1','G1','H1','I1','K1'], axis=1, inplace=True)
df = df.replace(r'^\s*$', np.nan, regex=True)
就我而言,我收到了错误:
<块引用>AttributeError: 'NoneType' 对象没有属性 'replace'
对我有用的解决方案与使用 inplace=True 并将行的结果分配给 df 有关。因此,在这里我必须通过编写 df = df.drop...
或使用 inplace=True
而不将表达式分配给 df 来将结果分配给 df。
我没有错误的解决方案是:
df = df.drop(['B1','C1','D2','E1','G1','H1','I1','K1'], axis=1)
对于您的情况更改为:
traindata = traindata.drop([j], axis=1)
答案 3 :(得分:0)
问题出在这行代码中:
traindata = traindata.drop(traindata.columns[j], axis=1, inplace=True)
函数 drop 会更改 traindata 的类型,因为您正在影响其返回值。
您不应该影响结果,因为它已应用于数据帧 你应该用以下代码替换那行代码:
traindata.drop(traindata.columns[j], axis=1, inplace=True)