数据框-AttributeError:“ NoneType”对象没有属性“ iloc”

时间:2018-06-30 00:40:56

标签: python-3.x dataframe attributeerror

我无法理解为什么代码中存在此错误。昨天,它工作得非常好,我得到了正确的结果。

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'. 

我试图寻找问题所在,但没有找到正确的答案

4 个答案:

答案 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)