【问题标题】:KeyError if is_scalar(key) and isna(key) and not self.hasnans:KeyError 如果 is_scalar(key) 和 isna(key) 而不是 self.hasnans:
【发布时间】:2022-10-13 18:03:20
【问题描述】:

大家好,我是 Python 新手,我正在学习数据分析课程,但遇到了一个问题。以下是问题,我的代码,然后是错误信息。

问题:公司想在餐厅的广告中提供促销优惠。获得优惠的条件是餐厅的评分必须超过50,平均评分应大于4。找到满足条件的餐厅才能获得促销优惠。

data

five_star_ratings = data.loc[data['rating']>4]

restaurant_ratings_count = five_star_ratings.groupby(['restaurant_name'])['rating'].count()

promo = restaurant_ratings_count[restaurant_ratings_count['rating']>50].count()

KeyError                                  Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   3360             try:
-> 3361                 return self._engine.get_loc(casted_key)
   3362             except KeyError as err:

5 frames
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'rating'

The above exception was the direct cause of the following exception:

KeyError                                  Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   3361                 return self._engine.get_loc(casted_key)
   3362             except KeyError as err:
-> 3363                 raise KeyError(key) from err
   3364 
   3365         if is_scalar(key) and isna(key) and not self.hasnans:

KeyError: 'rating'

【问题讨论】:

  • print(restaurant_ratings_count) - 看起来怎么样?它有你正在调节的钥匙吗?

标签: python pandas


【解决方案1】:

restaurant_ratings_count 不包含名为 rating 的列。它是一个Series 对象,名为rating,它的评分计数高于4。如果我理解你的分配,我相信你想要

restaurant_ratings_count = data.groupby(['restaurant_name'])['rating'].count()
promo = restaurant_ratings_count[restaurant_ratings_count>50]

这为您提供了评级超过 50 的餐厅的名称。 (他们没有要求超过 50 个 5 星评级的餐厅,这是您计算的。)

跟进

这会产生至少有一个 5 评级和至少 50 个任何种类评级的餐厅名称。我制作了两个系列,然后将它们合并。

import pandas as pd

datain = [
        ["McDonalds", 3],
        ["McDonalds", 5],
        ["McDonalds", 5],
        ["McDonalds", 2],
        ["McDonalds", 4],
        ["Carls", 3], ["Carls", 5], ["Carls", 5], ["Carls", 1], ["Carls", 2],
        ["Carls", 3], ["Carls", 5], ["Carls", 5], ["Carls", 1], ["Carls", 2],
        ["Carls", 3], ["Carls", 5], ["Carls", 5], ["Carls", 1], ["Carls", 2],
        ["Carls", 3], ["Carls", 5], ["Carls", 5], ["Carls", 1], ["Carls", 2],
        ["Carls", 3], ["Carls", 5], ["Carls", 5], ["Carls", 1], ["Carls", 2],
        ["Carls", 3], ["Carls", 5], ["Carls", 5], ["Carls", 1], ["Carls", 2],
        ["Carls", 3], ["Carls", 5], ["Carls", 5], ["Carls", 1], ["Carls", 2],
        ["Carls", 3], ["Carls", 5], ["Carls", 5], ["Carls", 1], ["Carls", 2],
        ["Carls", 3], ["Carls", 5], ["Carls", 5], ["Carls", 1], ["Carls", 2],
        ["Carls", 3], ["Carls", 5], ["Carls", 5], ["Carls", 1], ["Carls", 2],
        ["Carls", 3], ["Carls", 5], ["Carls", 5], ["Carls", 1], ["Carls", 2]
]
data = pd.DataFrame(datain, columns=['restaurant_name','rating'])
print(data)

five_star_ratings = data[data['rating']>4].drop_duplicates()['restaurant_name']
print(five_star_ratings)

restaurant_ratings_count = data.groupby(['restaurant_name'])['rating'].count()
print(restaurant_ratings_count)

more_than_50 = restaurant_ratings_count[restaurant_ratings_count>50]
print(more_than_50)

promo = pd.merge(five_star_ratings,more_than_50,left_on='restaurant_name',right_on='restaurant_name')
print(promo)


输出:

   restaurant_name  rating
0        McDonalds       3
1        McDonalds       5
2        McDonalds       5
3        McDonalds       2
4        McDonalds       4
5            Carls       3
6            Carls       5
7            Carls       5
8            Carls       1
9            Carls       2
10           Carls       3
11           Carls       5
12           Carls       5
13           Carls       1
14           Carls       2
15           Carls       3
16           Carls       5
17           Carls       5
18           Carls       1
19           Carls       2
20           Carls       3
21           Carls       5
22           Carls       5
23           Carls       1
24           Carls       2
25           Carls       3
26           Carls       5
27           Carls       5
28           Carls       1
29           Carls       2
30           Carls       3
31           Carls       5
32           Carls       5
33           Carls       1
34           Carls       2
35           Carls       3
36           Carls       5
37           Carls       5
38           Carls       1
39           Carls       2
40           Carls       3
41           Carls       5
42           Carls       5
43           Carls       1
44           Carls       2
45           Carls       3
46           Carls       5
47           Carls       5
48           Carls       1
49           Carls       2
50           Carls       3
51           Carls       5
52           Carls       5
53           Carls       1
54           Carls       2
55           Carls       3
56           Carls       5
57           Carls       5
58           Carls       1
59           Carls       2
1    McDonalds
6        Carls
Name: restaurant_name, dtype: object
restaurant_name
Carls        55
McDonalds     5
Name: rating, dtype: int64
restaurant_name
Carls    55
Name: rating, dtype: int64
  restaurant_name  rating
0           Carls      55

【讨论】:

  • 该问题要求促销的两个条件,显示评级 >4 和评级计数 >50 的餐厅名称。
  • 我有这个问题是因为评级列有 NaN 值吗?我试过你的代码显示 177 行,当我在 excel 中使用数据透视表过滤数据时,它返回了 2 个餐厅名称。
  • 没有看到你的数据,我不可能知道。为什么有 NaN 值?也许你应该在开始之前做一个dropna 来摆脱它们。
  • 部分任务是缺失值检测和处理。该数据集有 1898 行,其中 736 个评级为“未给出”。所以很早就我使用了 np.nan 并将数据类型更改为浮点数。我认为估算或删除缺少数据的行不是一个好主意,因为这些行还有其他有价值的数据值得保留以进行其他分析。我应该怎么办?
  • 同样,在没有看到数据的情况下,我们只是在猜测。对于此作业,您不关心其他列,因此dropna 不会造成任何伤害。正确的?
【解决方案2】:

重置索引... df.reset_index(inplace = True,drop = True)

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2019-05-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
相关资源
最近更新 更多