【问题标题】:Type error: Int object is not iterable error [For loop]类型错误:Int 对象不可迭代错误 [For 循环]
【发布时间】:2020-12-15 14:58:57
【问题描述】:

我在 Kaggle 上找到了一个练习,它将我的目的定义为:

我们希望在我们的网站上发布这些葡萄酒评论,但评分 从 80 到 100 分的系统太难理解了——我们会 喜欢把它们翻译成简单的星级。 95分或 较高的算作 3 星,得分至少 85 但低于 95 为 2 星星。任何其他分数都是 1 星。

此外,加拿大葡萄酒商协会在 网站,所以任何来自加拿大的葡萄酒都应该自动获得 3 星, 不管分数。

创建一个系列star_ratings,其星数对应 到数据集中的每条评论。

Data.head():

我写这段代码是为了达到我的目的:

def stars(reviews):
for i,pons in enumerate(reviews.points):
    if pons < 85:
        reviews.points[i] = "1 star"
    elif pons <95:
        reviews.points[i] = "2 stars"
    elif (pons >= 95):
        reviews.points[i] = "3 stars"
for i,cons in reviews.country:
    if cons == "Canada":
        reviews.points[i] = "3 stars"

star_ratings = reviews.apply(stars, axis = "columns")
        

This answer 对我不起作用,因为我不断收到

TypeError: 'int' 对象不可迭代

为什么我的 for 循环总是给我这个错误?

【问题讨论】:

  • 看起来reviews.points 是一个整数。您不能迭代单个整数。

标签: python pandas dataframe


【解决方案1】:

当您使用df.apply(axis='columns') 时,提供的函数将应用于输入DataFrame 的每一行

reviews 参数包含一个代表单行pd.Series。因此reviews.points 是单个单元格,而不是列。

这是重写函数的一种方法:

def stars(review):
    if review.points < 85:
        review.points = "1 star"
    elif review.points < 95:
        review.points = "2 stars"
    elif review.points >= 95:
        review.points = "3 stars"
    if review.country == "Canada":
        review.points = "3 stars"

star_ratings = reviews.apply(stars, axis="columns")

另一种性能更高的方法是放弃 apply 并使用矢量化指令:

star_ratings = reviews.copy()
star_ratings['points'] = pd.cut(star_ratings['points'], bins=[-np.inf, 85, 95, np.inf], labels=['1 star', '2 stars', '3 stars'])
star_ratings.loc[star_ratings['country'] == 'Canada', 'points'] = '3 stars'

【讨论】:

  • 非常感谢,我也理解并看到了后者的效率以及为什么我的代码首先不起作用。祝您今天愉快
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2022-12-06
  • 2017-05-14
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多