使用字符串元组作为索引的数据帧

我感觉到一些奇怪的熊猫行为。我有一个看起来像

df=pd.DataFrame(列=['Col 1'、'Col 2'、'Col 3'],
索引=[('1','a'),('2','a'),('1','b'),('2','b')]))
In[14]:df
Output[14]:
第1列第2列第3列
(1,a)楠楠
(二,一)楠楠楠
(1,b)楠楠
(2,b)楠楠

我可以设置任意元素的值

[15]on

:df['Col 2'].loc[('1','b')]=6
In[16]:df
Output[16]:
第1列第2列第3列
(1,a)楠楠
(二,一)楠楠楠
(1,b)楠6楠
(2,b)楠楠

但是当我去引用我刚才使用相同语法设置的元素时,我得到

[17]on

:df['Col 2'].loc[('1','b')]
KeyError:'标签[1]不At[索引]on'

有人能告诉我我做错了什么或者为什么会发生这种行为吗?难道不允许我将索引设置为多元素元组吗

编辑

显然,在列表中包装元组索引是有效的

[38]on

:df['Col 2'].loc[('1','b')]]
Output[38]:
(1,b)6
名称:列2,数据类型:对象

尽管在我的实际用例中,我仍然会遇到一些奇怪的行为,所以很高兴知道这是否是推荐的用法

选择括号中的元组被视为包含要检索的元素的序列。这就像您将['1','b']作为参数传递一样。因此,KeyError消息:pandas试图找到键'1',但显然没有找到它

这就是为什么在添加其他括号时它会起作用,因为现在参数变成了一个元素的序列——元组

您应该避免在选择中处理列表和元组参数的歧义。根据索引是简单索引还是多索引,行为也可能有所不同

在任何情况下,如果您询问这里的建议,我看到的一个建议是,您应该尝试不构建由元组组成的简单索引:如果您实际构建多索引,pandas将工作得更好,使用起来也更强大:

df=pd.DataFrame(列=['Col 1'、'Col 2'、'Col 3'],
index=pd.MultiIndex.from_元组([('1','a'),('2','a'),('1','b'),('2','b')]))
df['Col 2'].loc[('1','b')]=6
df['Col 2'].loc[('1','b')]
Out[13]:6
df
Output[14]:
第1列第2列第3列
1阿楠
2阿楠
1 b楠6楠
2b楠楠楠

发表评论