【问题标题】:Dataframe -- AttributeError: 'NoneType' object has no attribute 'iloc'数据框——AttributeError:“NoneType”对象没有属性“iloc”
【发布时间】:2018-12-09 04:27:57
【问题描述】:

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

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

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

【问题讨论】:

  • traindataNone。你能分享你定义它的代码吗?
  • 这里是代码:traindata = pd.read_csv('train.csv') traindata = pd.DataFrame(traindata)
  • 我正在使用 Jupyter,上面共享的代码位于不同的块中。但是我试图将它添加到同一个块中并运行代码,但我仍然得到了同样的错误
  • 您是否调试过您的代码(也许您没有显示所有相关代码)?检查 train.csv 的状态。
  • @JeroenHeier 我已经分享了我正在使用的代码。请告诉我您的建议

标签: python-3.x dataframe attributeerror


【解决方案1】:

这是完整的代码

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])

【讨论】:

    【解决方案2】:

    问题来自:traindata = traindata.drop(traindata.columns[j], axis=1, inplace=True)。你可以通过添加一行代码print(traindata)来检查traindata的值,你会看到它返回'None'。

    您可以更改为: traindata.drop(traindata.columns[j], axis=1, inplace=True)

    但是,您可能会收到新错误(IndexError: single positional indexer is out-of-bounds),因为您不断删除列。

    【讨论】:

      【解决方案3】:

      我在 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)
      

      【讨论】:

        【解决方案4】:

        问题出在这行代码:

        traindata = traindata.drop(traindata.columns[j], axis=1, inplace=True) 函数 drop 改变了 traindata 的类型,因为你正在影响它的返回值。

        您不应影响结果,因为它已应用于数据框 您应该将该行代码替换为:

        traindata.drop(traindata.columns[j], axis=1, inplace=True)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-10
          • 1970-01-01
          • 1970-01-01
          • 2019-01-01
          • 2021-12-26
          • 2019-07-23
          • 2018-05-13
          • 2020-09-07
          相关资源
          最近更新 更多