带有字符串元组作为索引的Pandas DataFrame

23

我感觉这里有一些奇怪的 pandas 行为。我有一个类似这样的数据框:

df = pd.DataFrame(columns=['Col 1', 'Col 2', 'Col 3'],
                  index=[('1', 'a'), ('2', 'a'), ('1', 'b'), ('2', 'b')])

In [14]: df
Out[14]:
       Col 1 Col 2 Col 3
(1, a)   NaN   NaN   NaN
(2, a)   NaN   NaN   NaN
(1, b)   NaN   NaN   NaN
(2, b)   NaN   NaN   NaN

我可以设置任意元素的值

In [15]: df['Col 2'].loc[('1', 'b')] = 6

In [16]: df
Out[16]:
       Col 1 Col 2 Col 3
(1, a)   NaN   NaN   NaN
(2, a)   NaN   NaN   NaN
(1, b)   NaN     6   NaN
(2, b)   NaN   NaN   NaN

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

In [17]: df['Col 2'].loc[('1', 'b')]
KeyError: 'the label [1] is not in the [index]'

有人能告诉我我做错了什么或者为什么会出现这种行为吗?我不能把索引设置为多元素元组吗?

编辑

显然,用列表包装元组索引可以解决问题。

In [38]: df['Col 2'].loc[[('1', 'b')]]
Out[38]:
(1, b)    6
Name: Col 2, dtype: object

虽然在实际使用中 我仍然遇到一些奇怪的行为,所以知道这不是推荐用法会很好。


1
这个问题的回答表明,不建议在 Pandas 中使用 DataFrame.ix 与元组索引,因为元组键和 MultiIndex 选择之间存在歧义。 - p-robot
将元组索引放入列表中对我有用。 - ZakS
1个回答

23

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

这就是为什么当您添加附加括号时它可以工作的原因,因为现在参数变成了一个元素的序列 - 您的元组。

您应该避免处理关于选择列表和元组参数的歧义。行为还取决于索引是简单索引还是多重索引。

无论如何,如果您在此处询问建议,我看到的建议是您应该尝试不要构建由元组组成的简单索引:如果您实际上构建一个多重索引,pandas将运作得更好,使用起来也更强大:

df = pd.DataFrame(columns=['Col 1', 'Col 2', 'Col 3'],
                  index=pd.MultiIndex.from_tuples([('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
Out[14]: 
    Col 1 Col 2 Col 3
1 a   NaN   NaN   NaN
2 a   NaN   NaN   NaN
1 b   NaN     6   NaN
2 b   NaN   NaN   NaN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接