Python KeyError:键长度超过索引深度-多索引
我解析了大量xml文件以获得一个数据帧。我现在需要删除一些列以进行数据分析。我无法在前面的问题中找到确切的错误。我用过-Python KeyError:键长度超过索引深度-多索引,python,pandas,multi-index,Python,Pandas,Multi Index,我解析了大量xml文件以获得一个数据帧。我现在需要删除一些列以进行数据分析。我无法在前面的问题中找到确切的错误。我用过- data = data["Rig Mode","Bit on Bottom","Block Position","Block Velocity",..] 并收到一条错误消息(完整的错误消息在post末尾)—— 所以我研究并去了,这里提到了lexsort-depth相关的错误,而我的错误正是上面发布的。我根据上面的帖子对索引进行了排序- `data = data.sort_i
data = data["Rig Mode","Bit on Bottom","Block Position","Block Velocity",..]
并收到一条错误消息(完整的错误消息在post末尾)——
所以我研究并去了,这里提到了lexsort-depth
相关的错误,而我的错误正是上面发布的。我根据上面的帖子对索引进行了排序-
`data = data.sort_index(level=1)`
pd.__version__
'0.22.0'
Python version - 3.6.4
得到了完全相同的错误。下面我获取我的多索引详细信息-
data.columns
#MultiIndex(levels=[['Bit on Bottom','Block Position', 'Block Velocity', 'Rig Mode',...], ['', '1/min', 'L/min', 'dega', ...]],
labels=[[38, 0, 2, 22, ...]],
names=['Description', 'Unit'])
这就是我在准备dataframe时构建多重索引的方式,现在列标题被解析为数据集中的行-
data.columns = pd.MultiIndex.from_arrays([data.iloc[0],data.iloc[1]], names = ['Description','Unit'])
data=data.iloc[2:]
#### complete error message:
> --------------------------------------------------------------------------- KeyError Traceback (most recent call
> last) <ipython-input-119-60ad57c2383f> in <module>()
> 3 "Continuous Survey Depth","Pump 1 Stroke Rate","Pump 2 Stroke Rate","Pump 3 Stroke Rate",
> 4 "Average Standpipe Pressure","Slips stat (1=Out,0=In)", "Weight on Bit","Mud Flow
> In","Time","Average Surface Torque",
> ----> 5 "MWD Turbine RPM"]
>
> ~\Anaconda3\lib\site-packages\pandas\core\frame.py in
> __getitem__(self, key) 2135 return self._getitem_frame(key) 2136 elif is_mi_columns:
> -> 2137 return self._getitem_multilevel(key) 2138 else: 2139 return self._getitem_column(key)
>
> ~\Anaconda3\lib\site-packages\pandas\core\frame.py in
> _getitem_multilevel(self, key) 2179 2180 def _getitem_multilevel(self, key):
> -> 2181 loc = self.columns.get_loc(key) 2182 if isinstance(loc, (slice, Series, np.ndarray, Index)): 2183
> new_columns = self.columns[loc]
>
> ~\Anaconda3\lib\site-packages\pandas\core\indexes\multi.py in
> get_loc(self, key, method) 2076 if self.nlevels < keylen:
> 2077 raise KeyError('Key length ({0}) exceeds index depth
> ({1})'
> -> 2078 ''.format(keylen, self.nlevels)) 2079 2080 if keylen == self.nlevels and self.is_unique:
>
> KeyError: 'Key length (22) exceeds index depth (2)'
data.columns=pd.MultiIndex.from_数组([data.iloc[0],data.iloc[1]],name=['Description','Unit']))
data=data.iloc[2:]
####完整错误消息:
>-------------------------------------------------------------KeyError回溯(最近的调用
>最后)在()
>3“连续测量深度”、“泵1冲程速率”、“泵2冲程速率”、“泵3冲程速率”,
>4“平均立管压力”、“卡瓦状态(1=Out,0=In)”、“钻头重量”、“泥浆流量”
>在“,”时间“,”平均表面扭矩“,
>--->5“MWD涡轮转速”]
>
>中的~\Anaconda3\lib\site packages\pandas\core\frame.py
>返回self.\u getitem.\u(self,key)2135返回self.\u getitem.\u frame(key)2136 elif是\u mi_列:
>->2137返回自我。\u getitem\u多级(键)2138其他:2139返回自我。\u getitem\u列(键)
>
>中的~\Anaconda3\lib\site packages\pandas\core\frame.py
>_getitem_多级(自,键)21792180 def_getitem_多级(自,键):
>->2181 loc=self.columns.get_loc(key)2182如果存在(loc,(切片、系列、np.ndarray、索引)):2183
>新列=自列[loc]
>
>中的~\Anaconda3\lib\site packages\pandas\core\index\multi.py
>如果self.nlevels2077 raise KeyError('键长度({0})超过索引深度
> ({1})'
>->2078“”。如果keylen==self.nlevels且self.nlevels是唯一的,则格式(keylen,self.nlevels))2079 2080:
>
>KeyError:'键长度(22)超过索引深度(2)'
要选择列的子集,必须使用[[]]
:
data = data[["Rig Mode","Bit on Bottom","Block Position","Block Velocity",..]]
\uuuu getindex\uuuu
的负载过大
使用多索引,它将尝试选择列:
In [21]: df = pd.DataFrame([[1, 2], [3, 4], [5, 6]], columns=[["A", "AA"], ["B", "BB"]])
In [22]: df
Out[22]:
A AA
B BB
0 1 2
1 3 4
2 5 6
In [23]: df["A"]
Out[23]:
B
0 1
1 3
2 5
In [24]: df["A", "B"]
Out[24]:
0 1
1 3
2 5
Name: (A, B), dtype: int64
这是哪一行?它看起来与您引用的不同..?文章的第一行显示了此错误。df中有50多列。在错误消息中,它显示的列名与我在代码行中提到的列名不同。这可能会引起一些混乱。是不是
名称
列表?
In [11]: df = pd.DataFrame([[1, 2], [3, 4], [5, 6]], columns=["A", "B"])
In [12]: df
Out[12]:
A B
0 1 2
1 3 4
2 5 6
In [13]: df["A"]
Out[13]:
0 1
1 3
2 5
Name: A, dtype: int64
In [14]: df["A", "B"]
KeyError: ('A', 'B')
In [21]: df = pd.DataFrame([[1, 2], [3, 4], [5, 6]], columns=[["A", "AA"], ["B", "BB"]])
In [22]: df
Out[22]:
A AA
B BB
0 1 2
1 3 4
2 5 6
In [23]: df["A"]
Out[23]:
B
0 1
1 3
2 5
In [24]: df["A", "B"]
Out[24]:
0 1
1 3
2 5
Name: (A, B), dtype: int64