Pandas 理解多索引和双括号

Pandas 理解多索引和双括号,pandas,multi-index,Pandas,Multi Index,我试图理解多重索引。我发现了一些非常好的链接(和),但我无法理解这个概念 我确实有一些具体的问题。具体来说,如果我们谈论这些数据- import pandas as pd # hierarchical indices and columns index = pd.MultiIndex.from_product([[2013, 2014], [1, 2]], names=['year', 'visit']) columns =

我试图理解多重索引。我发现了一些非常好的链接(和),但我无法理解这个概念

我确实有一些具体的问题。具体来说,如果我们谈论这些数据-

import pandas as pd

# hierarchical indices and columns
index = pd.MultiIndex.from_product([[2013, 2014], [1, 2]],
                                   names=['year', 'visit'])
columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'Sue'], ['HR', 'Temp']],
                                     names=['subject', 'type'])

# mock some data
data = np.round(np.random.randn(4, 6), 1)
data[:, ::2] *= 10
data += 37

# create the DataFrame
health_data = pd.DataFrame(data, index=index, columns=columns)
然后:

  • 为什么/如何
    health_data.loc[:,'Guido']
    删除顶部列 索引而
    health\u data.loc[:,['Guido']
    保留它
  • 为什么
    health_data.loc[:,[('Bob','HR')]
    health_data.loc[:,
    ('Bob','HR')]
    按预期工作(假设问题1的答案为 清除)但
    health\u data.loc[:,['Bob','HR']
    提供额外的 专栏
  • 如果我定义
    idx=pd.indexlice
    那么为什么
    health_data.loc[:,[idx['Bob','HR']]
    返回预期的输出,但
    health_data.loc[:,list(idx['Bob','HR'])
    返回额外的列

  • 由于我对多索引缺乏了解,所以我提出的问题,任何详细解释它们的链接都会有所帮助。我已经看到了一些这样的问题和答案(有点帮助),但其中大多数都非常具体,我找不到一个一般谈论双括号概念的问题和答案

    Q1:
    health_data.loc[:,'Guido']
    从列多索引的第一级选择一个列,而
    health_data.loc[:,['Guido']
    从同一级选择一列。我想pandas开发人员可以选择将1元素列表作为一个特例,并从响应中删除冗余维度,但他们没有这样做

    In [6]: health_data.loc[:,'Guido']
    Out[6]: 
    type          HR  Temp
    year visit            
    2013 1      38.0  35.4
         2      29.0  36.9
    2014 1      41.0  36.6
         2      26.0  36.9
    
    In [7]: health_data.loc[:,['Guido']]
    Out[7]: 
    subject    Guido      
    type          HR  Temp
    year visit            
    2013 1      38.0  35.4
         2      29.0  36.9
    2014 1      41.0  36.6
         2      26.0  36.9
    
    问题2:案例1和案例2选择1列,首先作为列的1元素列表,然后作为单列值(分别与案例2和案例1类似)。案例3更有趣:它从多索引的第一级选择一个项目列表。由于该级别的值中只存在“Bob”,因此它将返回第一个级别中包含“Bob”的所有列

    In [29]: health_data.loc[:, [('Bob', 'HR')]]
    Out[29]: 
    subject      Bob
    type          HR
    year visit      
    2013 1      29.0
         2      47.0
    2014 1      56.0
         2      37.0
    
    In [30]: health_data.loc[:, ('Bob', 'HR')]
    Out[30]: 
    year  visit
    2013  1        29.0
          2        47.0
    2014  1        56.0
          2        37.0
    Name: (Bob, HR), dtype: float64
    
    In [31]: health_data.loc[:, ['Bob', 'HR']]
    Out[31]: 
    subject      Bob      
    type          HR  Temp
    year visit            
    2013 1      29.0  36.5
         2      47.0  37.7
    2014 1      56.0  38.5
         2      37.0  37.3
    
    Q3这基本上是Q2的重新运行:
    idx['Bob','HR']
    计算为
    ('Bob','HR')
    ,它从多索引中选择一个列<代码>列表(idx['Bob','HR'])的计算结果为
    ['Bob','HR']
    ,它从多索引的第一级选择列列表

    In [18]: health_data.loc[:,[idx['Bob','HR']]]
    Out[18]: 
    subject      Bob
    type          HR
    year visit      
    2013 1      29.0
         2      47.0
    2014 1      56.0
         2      37.0
    
    In [19]: health_data.loc[:,list(idx['Bob','HR'])]
    Out[19]: 
    subject      Bob      
    type          HR  Temp
    year visit            
    2013 1      29.0  36.5
         2      47.0  37.7
    2014 1      56.0  38.5
         2      37.0  37.3
    
    由于多索引的第一级中不存在“HR”,因此切片仅选择“Bob”。如果将“HR”替换为“Sue”,您可以更清楚地看到差异:

    In [27]: health_data.loc[:,[idx['Bob','Sue']]]
    Out[27]: 
    subject    Bob
    type       Sue
    year visit    
    2013 1     NaN
         2     NaN
    2014 1     NaN
         2     NaN
    
    In [28]: health_data.loc[:,list(idx['Bob','Sue'])]
    Out[28]: 
    subject      Bob         Sue      
    type          HR  Temp    HR  Temp
    year visit                        
    2013 1      29.0  36.5  35.0  36.4
         2      47.0  37.7  36.0  36.4
    2014 1      56.0  38.5  34.0  37.8
         2      37.0  37.3  30.0  36.9
    
    在第一种情况下,我们选择了一个多索引值为
    ('Bob','Sue')
    的列,该列不存在,因此出现了
    NaNs
    。在第二种情况下,我们选择的列包含多索引第一级中列表
    ['Bob','Sue']
    中的所有值。我必须承认,看到元组和列表在这里给出不同的结果让我很惊讶。我想这也是API的决定

    这些文件涵盖了以下大部分内容:


    刚刚纠正了对第2部分的误读:-)。另外,我不知道为什么代码块格式只适用于我答案的最后一部分-对此我很抱歉!感谢详细的逐步回答,我认为(不是很确定)当上面的段落是一个列表时,代码块需要双缩进。我已经做了一些编辑,使它更可读,但我的更改将在同行审查后才可见。我需要一些时间来完成答案,如果有问题,我会回来的。嘿,谢谢你修复代码块的东西。如果仍然不清楚,请告诉我。多索引可能是一个令人困惑的话题,我从经验中知道。。。