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