【问题标题】:Python (Pandas) error 'the label [Algeria] is not in the [index]'Python(熊猫)错误'标签[阿尔及利亚]不在[索引]中'
【发布时间】:2017-01-02 13:51:02
【问题描述】:

我不明白为什么会这样

df[(df['Gold']>0) & (df['Gold.1']>0)].loc[((df['Gold'] - df['Gold.1'])/(df['Gold'])).abs().idxmax()]

但是当我除以(df['Gold'] + df['Gold.1'] + df['Gold.2']) 它停止工作给我你可以在下面找到的错误。

有趣的是,以下行有效

df.loc[((df['Gold'] - df['Gold.1'])/(df['Gold'] + df['Gold.1'] + df['Gold.2'])).abs().idxmax()]

我不明白发生了什么,因为我刚开始学习 Python 和 Pandas。我需要了解发生这种情况的原因以及如何解决。

错误

KeyError: '标签 [Algeria] 不在 [index] 中'

DataFrame 快照

【问题讨论】:

  • 试试print(df.index.tolist()),里面可能有空格。
  • @MaharajaX:以后请发布您的数据框的文本示例,以便我们可以使用它(或生成它的代码),而不是图片。例如,请参阅How to make good reproducible pandas examples。谢谢,祝你的课程好运;)
  • 示例数据框没有太大帮助,因为所有国家/地区的冬季奖牌数 (Gold.1,Silver.1,Bronze.1,Total.1)) 都为零。顺便说一下,为了清楚起见,我会将这些系列命名为 Gold.S, Gold.W, Gold
  • 如果您向我们发布可重现的代码和数据集(或 URL),我们可以回复。这是一个很好的习语练习题。您的错误的原因是“多索引”,即df[...][...] 将导致 LHS 表达式为您提供一个副本,然后 RHS 表达式尝试处理/修改该副本,而不是直接在源 df 上工作。 df.filter 可能是更好的选择...

标签: python pandas indexing assign


【解决方案1】:

你的问题是boolean indexing:

df[(df['Gold']>0) & (df['Gold.1']>0)]

返回一个过滤的 DataFrame,其中不包含您使用此计算的 maxindexSeries

((df['Gold'] - df['Gold.1'])/(df['Gold'] + df['Gold.1'] + df['Gold.2'])).abs().idxmax()

在您的数据中是Algeria

所以loc 逻辑上抛出KeyError

一种可能的解决方案是将新过滤的DataFrame分配给df1,然后使用idxmax获取与Series的最大值对应的索引:

df1 = df[(df['Gold']>0) & (df['Gold.1']>0)]
df2 = df1.loc[((df1['Gold']-df1['Gold.1'])/(df1['Gold']+df1['Gold.1']+df1['Gold.2'])).abs().idxmax()]

【讨论】:

  • 我并没有真正得到这个“返回不包含系列最大值索引的df:”所以你是说最大值不在布尔运算后返回的数据帧中?我虽然我们首先执行布尔过滤器,然后在过滤的内容上找到最大值。不就是这样吗?
  • 不,因为尽管您对其进行了过滤,但您并未在 ((df['Gold'] - df['Gold.1'])/(df['Gold'] + df['Gold.1'] + df['Gold.2'])).abs().idxmax() 中使用过滤后的值,而是使用原始未过滤的值。顺便说一句,这是一个非常难调试的错误,因为有时它工作得很好——如果过滤的数据帧包含 idxmax,但有时如果值改变它会失败。如果Algeria返回((df['Gold'] - df['Gold.1'])/(df['Gold'] + df['Gold.1'] + df['Gold.2'])).abs().idxmax(),你可以看到Gold.1==0,所以不是(df['Gold.1']>0)
  • 嗯,谢谢。这太奇怪了。当它带来如此微妙的错误并且不能按预期方式工作时,允许这样的写作甚至有什么意义。我希望它从左到右进行评估。相反,它的工作原理很奇怪:(无论如何,谢谢!
猜你喜欢
  • 2022-12-09
  • 1970-01-01
  • 2015-12-17
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多