数据框中的对象值的 KeyError

Posted

技术标签:

【中文标题】数据框中的对象值的 KeyError【英文标题】:KeyError for an object value that is in the dataframe 【发布时间】:2020-03-21 09:45:48 【问题描述】:

有人能解释一下为什么“Louisville”会返回 KeyError 吗?据我了解,它在数据框中。我错过了什么?

这是数据的样子。这是一个 CSV。

这就是off_data.head() 的样子

off_data.index()

off_data.columns

off_data[0:2].to_dict()

Rajith Thennakoon 的建议

'Conf': 'Michigan St. ': 'B10', 'Louisville ': 'ACC',
 'AdjTempo': 'Michigan St. ': 70.4, 'Louisville ': 67.8,
 'AdjOE': 'Michigan St. ': 114.4, 'Louisville ': 113.9,
 'eFG%': 'Michigan St. ': 52.9, 'Louisville ': 60.7,
 'TO%': 'Michigan St. ': 15.9, 'Louisville ': 17.1,
 'OR%': 'Michigan St. ': 37.1, 'Louisville ': 32.8,
 'FTRate': 'Michigan St. ': 30.9, 'Louisville ': 32.5,
 'AdjDE': 'Michigan St. ': 85.1, 'Louisville ': 87.5,
 'deFG%': 'Michigan St. ': 40.3, 'Louisville ': 42.9,
 'dTO%': 'Michigan St. ': 20.7, 'Louisville ': 15.9,
 'dOR%': 'Michigan St. ': 25.0, 'Louisville ': 27.6,
 'dFTRate': 'Michigan St. ': 27.3, 'Louisville ': 26.0

输入

import pandas as pd

off_data = pd.read_csv(r'C:\Users\westc\Desktop\sports.data\ncaab\kenpomdata\off20.csv', index_col= 'Team')

type(off_data)

off_data.loc["Louisville",0]

输出

KeyError Traceback(最近调用 最后)~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py 在 get_loc(self, key, method, tolerance) 2896 尝试: -> 2897 return self._engine.get_loc(key) 2898 除了 KeyError:

pandas_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas_libs\hashtable_class_helper.pxi 在 pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas_libs\hashtable_class_helper.pxi 在 pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: '路易斯维尔'

在处理上述异常的过程中,又发生了一个异常:

KeyError Traceback(最近调用 最后)在 4 5 类型(off_data) ----> 6 off_data.loc["Louisville",0]

~\Anaconda3\lib\site-packages\pandas\core\indexing.py 在 getitem(self, key) 1416 except (KeyError, IndexError, AttributeError): 1417 pass -> 1418 return self._getitem_tuple(key) 1419 else: 1420 # 根据定义,我们只有第 0 个轴

~\Anaconda3\lib\site-packages\pandas\core\indexing.py 在 _getitem_tuple(自我,tup) 第803章 804尝试: --> 805 返回 self._getitem_lowerdim(tup) 806 除了索引错误: 807通过

~\Anaconda3\lib\site-packages\pandas\core\indexing.py 在 _getitem_lowerdim(自我,tup) 927 for i, 键入 enumerate(tup): 928 if is_label_like(key) 或 isinstance(key, tuple): --> 929 部分 = self._getitem_axis(key, axis=i) 930 第931章

~\Anaconda3\lib\site-packages\pandas\core\indexing.py 在 _getitem_axis(self, key, axis) 1848 # 直接查找 1849 self._validate_key(key, axis) -> 1850 返回 self._get_label(key, axis=axis) 1851 1852

~\Anaconda3\lib\site-packages\pandas\core\indexing.py 在 _get_label(自我,标签,轴) 158 raise IndexingError("这里没有切片,在别处处理") 159 --> 160 返回 self.obj._xs(label, axis=axis) 161 162 def _get_loc(自我,键:int,轴:int):

~\Anaconda3\lib\site-packages\pandas\core\generic.py in xs(self, key, 轴,水平,drop_level)3735 loc,new_index = self.index.get_loc_level(key, drop_level=drop_level) 3736 别的: -> 3737 loc = self.index.get_loc(key) 3738 3739 if isinstance(loc, np.ndarray):

~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py 在 get_loc(self, key, method, tolerance) 2897 返回 self._engine.get_loc(key) 2898 `

【问题讨论】:

你能清理错误信息,只显示 KeyError 和其他“错误”类型吗? 试试这个off_data.loc[0,"Louisville"] 0应该代表什么? @rajiththennakoon 如果他们将“Teams”作为索引,那么这没有任何意义 向我们展示 df 读入后的样子,以及 off_data.index 和 off_data.columns 【参考方案1】:

您可以通过以下方式获取该行:

off_data.loc[off_data['Team'] == "Louisville"]

您进行定位的方式需要列名,根据您的输出显示为团队,您可以尝试这些以查看它们是否有效:

In [4496]: df2.loc[0,"Team"]                                                                                                                                                   
Out[4496]: 'Michigan'

In [4497]: df2.loc[1,"Team"]                                                                                                                                                   
Out[4497]: 'Louisville'

看起来数据中有空格,这里有一个快速去除末尾空格的方法:

off_data.index = off_data.index.str.strip()

应该让您按原样进行搜索:

off_data[off_data.index == 'Louisville']

【讨论】:

@westcollins 嗯,你能提供一个“off_data[0:2].to_dict()”来检查吗? 刚刚添加到其他图片下 Team 和 Conf 好像合并了,如果你能把那个 to_dict 值作为文本括在 ``` ``` 我可能读进去并弄清楚 让我知道这是否是您所要求的 我看到一个问题,您的团队名称中有一个空格:“Louisville”,这会影响搜索。你可以在这里做一些事情,我会发布它们【参考方案2】:

试试这个

off_data.index = off_data.index.str.strip()
off_data.loc[off_data.index == "Louisville"]

编辑

如果您需要在读取数据帧时删除空格。您可以使用skipinitialspace=True。这将在分隔符后跳过空格。

df1 = pd.read_csv(.. skipinitialspace=True)

或者需要去掉特定列的空格,可以这样使用

df["column_name"] = df["column_name"].str.strip()

或者您也可以使用 pandas rstrip 或 lstrip。

lstrip,从左侧的系列/索引中的每个字符串中去除空格(包括换行符)或一组指定字符。

rstrip,从右侧的系列/索引中的每个字符串中去除空格(包括换行符)或一组指定字符。

【讨论】:

见上面我添加了你的建议的图片 我猜前导和尾随空格是问题..检查更新的答案 非常感谢。问题只是尾随空格:/。你有解决方案来去除尾随空格而不将 off_data 转换为索引吗? @westcollins 查看详细答案,我想它会回答你上面提到的问题

以上是关于数据框中的对象值的 KeyError的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤掉具有特定和不同值的数据框中的条目?

基于具有列表值的多列删除数据框中的重复行[重复]

用相关列的平均值替换数据框中的 NaN 值的函数

如何根据火花数据框中的值的累积总和为每一行分配一个类别?

Pandas:如何根据特定列上特定值的条件选择数据框中的行[重复]

如何使用pyspark将具有多个可能值的Json数组列表转换为数据框中的列