在Pandas中使用元组索引与DataFrame.ix

3
我有一堆Pandas代码使用元组作为索引。我最近遇到了需要使用 DataFrame.ix 访问DataFrame的单个元素,但这些元素用元组表示时出现了混淆。它似乎认为我的元组是我想要访问的键序列,而不是一个我想要访问的单个键(恰好是一个序列)。如何提取一个以元组为键的单个行?
也许这是一个警示故事,不要在 Pandas 索引中使用序列,但在我的情况下,已经太晚了。
import string, pandas as pd, numpy as np

bar = pd.DataFrame(np.random.random((8,2)))
bar.columns = ['col1', 'col2']
bar.index = list(string.ascii_lowercase)[:8]
print bar
print bar.iloc[0].name
print bar.ix[bar.iloc[0].name]

bar.index = [tuple(list(string.ascii_lowercase)[i:i+3]) for i in range(8)]
print bar.iloc[0].name
print bar.ix[bar.iloc[0].name] # Fails with `KeyError: 'a'`

确认两种解决方案都可行。我会接受使用 ix 的那个,因为它更符合所问问题的要求。但这两种方案中是否有任何一种更受欢迎? - kuzzooroo
在这里可能更适合使用 xs。索引器(ixilocloc)可以做更多的事情,但由于元组键和 MultiIndex 选择之间的语法歧义,它可能更容易出错。 - chrisb
2个回答

6
你可以将元组放入列表中来实现这一点。
In [17]: bar.ix[[bar.iloc[0].name]]
Out[17]: 
               col1      col2
(a, b, c)  0.216689  0.262511

请注意,此处返回的是DataFrame实例,而其他答案中的“xs”方法返回的是Series实例。 - Lei

3

我认为使用索引无法实现,但是可以使用 xs 实现:

>>> bar.xs(bar.iloc[0].name)
col1    0.864788
col2    0.708136
Name: (a, b, c), dtype: float64

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