【问题标题】:Error in ('str' object has no attribute 'iloc')(“str”对象没有属性“iloc”)中的错误
【发布时间】:2021-12-24 23:09:55
【问题描述】:

我正在处理这段代码,但出现错误

代码:

for dataset in train_data:
    dataset.iloc[dataset['Age'] <= 20, 'Age'] = 1,
    dataset.iloc[(dataset['Age'] > 20, 'Age') & (dataset['Age'] <= 40), 'Age'] = 2,
    dataset.iloc[dataset['Age'] > 40, 'Age'] = 3

错误: “str”对象没有属性“iloc”

我应该改变什么来解决这个问题? 谢谢。

【问题讨论】:

  • 错误提示数据集是一个字符串。仔细检查 dataset 和 train_data 的内容。
  • 您能否描述一下您的变量,我的印象是您的 train_data 是一个数据帧列表,但显然不是因为错误清楚地指出 train_data 的元素是字符串。请您仔细检查一下,并根据您的数据类型更新您的问题。
  • 什么是train_data?如果我们不知道,我们无能为力,显然您也不知道(否则您不会收到这样的错误)
  • 如果train_data 是pandas 数据框,for dataset in train_data 将遍历train_data 的列名,而不是值,从而给你一个字符串和这个错误。

标签: pandas anaconda jupyter


【解决方案1】:

我们可以强制age 列的类型为float,然后使用numpy.select 得到预期的结果:

import numpy as np


dataset['Age'] = dataset['Age'].astype(float)

condlist = [dataset['Age'] <= 20, 
            (dataset['Age'] > 20, 'Age') & (dataset['Age'] <= 40), 
            dataset['Age'] > 40]

choicelist = [1, 2, 3]            

dataset['Age'] = np.select(condlist, choicelist, default=np.nan)

【讨论】:

  • 没有必要使用for循环来改变列类型,请检查你的代码,它会误导。
  • 嗨优素福,感谢您的评论,我更新了答案:)
  • 嗨@mar​​,如果这个或任何答案已经解决了您的问题,请点击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
  • 我们不知道您的解决方案是否正确,问题不够清楚,无法给出解决方案
猜你喜欢
  • 1970-01-01
  • 2016-04-07
  • 2021-07-19
  • 1970-01-01
  • 2018-02-08
  • 2018-03-15
  • 2019-03-30
  • 2016-01-29
  • 1970-01-01
相关资源
最近更新 更多