Python 为什么在具有一级索引的多索引列的数据帧中,行为会有所不同?

Python 为什么在具有一级索引的多索引列的数据帧中,行为会有所不同?,python,pandas,dataframe,indexing,multi-index,Python,Pandas,Dataframe,Indexing,Multi Index,使用找到的pandas文档中的示例,以下索引工作正常,结果是pd.Series: import pandas as pd tuples = [(1, 'red'), (1, 'blue'), (2, 'red'), (2, 'blue')] columns = pd.MultiIndex.from_tuples(tuples, names=('number', 'color')) asdf = pd.DataFrame(columns=columns, index=[0, 1

使用找到的
pandas
文档中的示例,以下索引工作正常,结果是
pd.Series

import pandas as pd
tuples = [(1, 'red'), (1, 'blue'),
          (2, 'red'), (2, 'blue')]
columns = pd.MultiIndex.from_tuples(tuples, names=('number', 'color'))
asdf = pd.DataFrame(columns=columns, index=[0, 1])
asdf.loc[:, (1, 'red')]
但是,如果我稍微更改代码,去掉一个级别,相同的索引将不起作用:

import pandas as pd
tuples = [(1,), (2,)]
columns = pd.MultiIndex.from_tuples(tuples, names=['number'])
asdf = pd.DataFrame(columns=columns, index=[0, 1])
asdf.loc[:, (1,)]

IndexError                                Traceback (most recent call last)
<ipython-input-43-d55399a979fa> in <module>
----> 1 asdf.loc[:, (1,)]

/opt/conda/lib/python3.8/site-packages/pandas/core/indexing.py in __getitem__(self, key)
   1760                 except (KeyError, IndexError, AttributeError):
   1761                     pass
-> 1762             return self._getitem_tuple(key)
   1763         else:
   1764             # we by definition only have the 0th axis

/opt/conda/lib/python3.8/site-packages/pandas/core/indexing.py in _getitem_tuple(self, tup)
   1270     def _getitem_tuple(self, tup: Tuple):
   1271         try:
-> 1272             return self._getitem_lowerdim(tup)
   1273         except IndexingError:
   1274             pass

/opt/conda/lib/python3.8/site-packages/pandas/core/indexing.py in _getitem_lowerdim(self, tup)
   1371         # we may have a nested tuples indexer here
   1372         if self._is_nested_tuple_indexer(tup):
-> 1373             return self._getitem_nested_tuple(tup)
   1374 
   1375         # we maybe be using a tuple to represent multiple dimensions here

/opt/conda/lib/python3.8/site-packages/pandas/core/indexing.py in _getitem_nested_tuple(self, tup)
   1451 
   1452             current_ndim = obj.ndim
-> 1453             obj = getattr(obj, self.name)._getitem_axis(key, axis=axis)
   1454             axis += 1
   1455 

/opt/conda/lib/python3.8/site-packages/pandas/core/indexing.py in _getitem_axis(self, key, axis)
   1963         # fall thru to straight lookup
   1964         self._validate_key(key, axis)
-> 1965         return self._get_label(key, axis=axis)
   1966 
   1967 

/opt/conda/lib/python3.8/site-packages/pandas/core/indexing.py in _get_label(self, label, axis)
    620             # see GH5667
    621             return self.obj._xs(label, axis=axis)
--> 622         elif isinstance(label, tuple) and isinstance(label[axis], slice):
    623             raise IndexingError("no slices here, handle elsewhere")
    624 

IndexError: tuple index out of range
将熊猫作为pd导入
元组=[(1,),(2,)]
columns=pd.MultiIndex.from_元组(元组,名称=['number'])
asdf=pd.DataFrame(列=列,索引=[0,1])
asdf.loc[:,(1,)]
索引器回溯(最后一次最近调用)
在里面
---->1 asdf.loc[:,(1,)]
/opt/conda/lib/python3.8/site-packages/pandas/core/index.py in_u__获取项目(self,key)
1760除外(KeyError、Indexer、AttributeError):
1761通行证
->1762返回self.\u getitem\u元组(键)
1763其他:
1764#根据定义,我们只有第0轴
/opt/conda/lib/python3.8/site-packages/pandas/core/index.py in_getitem_tuple(self,tup)
1270 def_getitem_元组(self,tup:tuple):
1271尝试:
->1272返回自我。\u getitem\u lowerdim(tup)
1273除索引错误外:
1274通行证
/opt/conda/lib/python3.8/site-packages/pandas/core/index.py in_getitem_lowerdim(self,tup)
1371#这里可能有一个嵌套的元组索引器
1372如果self.\u是嵌套的元组索引器(tup):
->1373返回self.\u getitem\u嵌套\u元组(tup)
1374
1375#我们可能在这里使用元组来表示多个维度
/opt/conda/lib/python3.8/site-packages/pandas/core/index.py in_getitem_nested_tuple(self,tup)
1451
1452电流_ndim=obj.ndim
->1453 obj=getattr(obj,self.name)。\u getitem\u轴(键,轴=轴)
1454轴+=1
1455
/轴中的opt/conda/lib/python3.8/site-packages/pandas/core/index.py(self、key、axis)
1963年#直接查找
1964自我验证键(键,轴)
->1965返回自我。获取标签(键,轴=轴)
1966
1967
/标签中的opt/conda/lib/python3.8/site-packages/pandas/core/index.py(self、label、axis)
620#见GH5667
621返回自身对象(标签,轴=轴)
-->622 elif isinstance(标签,元组)和isinstance(标签[轴],切片):
623 raise INDESINGERROR(“此处无切片,别处处理”)
624
索引器错误:元组索引超出范围
此外,将其索引为
asdf.loc[:,1]
会引发
类型错误
,而且,将其索引为
asdf.loc[:,((1,),)]
会起作用,但结果是
pd.DataFrame
,而不是
pd.Series

为什么会发生这种情况?提前非常感谢


备注:我对从这些问题中“抽象”我的代码感兴趣(在
pd.DataFrame.columns
中一个级别与多个级别)。在我工作的公司,有时我们需要多个级别的客户数据,但有时只需要一个级别。

您是否更新了pandas的版本?在pandas v1.1.0中,您可以像以前一样使用一个级别进行索引,切片返回一个
pd.Series

import pandas as pd
tuples = [(1,), (2,)]
columns = pd.MultiIndex.from_tuples(tuples, names=['number'])
asdf = pd.DataFrame(columns=columns, index=[0, 1])
asdf.loc[:, (1,)]
输出:

0    NaN
1    NaN

我不知道
ng.
是什么。。。。如果我删除
ng.
@RobRaymond抱歉,这是一个遗留代码,那么这两种代码对我来说都是一样的。我刚刚编辑了我的问题。谢谢
asdf.loc[:,(1,)]
在1.1版中对我很好。0@RichieV是的,很好用!我将不得不更新熊猫,我目前的版本是
v1.0.3
。这个!这就是我一直在寻找的!谢谢是的,我应该更新
pandas
,我当前的版本是
v1.0.3