像访问普通列一样访问 Pandas 索引

64

我有一个带有命名索引的Pandas DataFrame。我想将其传递给一段代码,该代码需要一个DataFrame、一个列名和其他一些东西,并对该列进行大量操作。只是在这种情况下,我想要突出显示的列是索引,但是将索引的标签提供给这段代码是行不通的,因为你不能像提取常规列那样提取索引。例如,我可以像这样构造一个DataFrame:

import pandas as pd, numpy as np

df=pd.DataFrame({'name':map(chr, range(97, 102)), 'id':range(10000,10005), 'value':np.random.randn(5)})
df.set_index('name', inplace=True)

这是结果:

         id     value
name                 
a     10000  0.659710
b     10001  1.001821
c     10002 -0.197576
d     10003 -0.569181
e     10004 -0.882097

现在,我应该如何访问name列?

print(df.index)  # No problem
print(df['name'])  # KeyError: u'name'

我知道有像复制列或更改索引为其他内容的解况方法。但是否有更干净的方式,比如一种将索引与其他内容同等对待的某种形式的列访问方式?


1
如果您想在pandas中使用此功能,请考虑为此GitHub问题点赞(upvoting):https://github.com/pandas-dev/pandas/issues/8162 - william_grisaitis
3个回答

32

在Pandas中,“Index”具有特殊含义。它用于优化特定操作,可以在各种方法中使用,例如合并/连接数据。因此,请作出选择:

  • 如果它只是“另一列”,请使用reset_index并将其视为另一列。
  • 如果它真正用于索引,请保留为索引并使用df.index

我们不能为您做出这个选择。它应取决于基础数据的结构以及您打算如何分析数据。

有关使用数据帧索引的更多信息,请参见:


9
假设我有一个库函数,它接受一个DataFrame并基于其创建散点图。它根据您选择的列标记图中的点,目前是指定为字符串。现在出现了一种使用情况,希望标签基于某个DataFrame的索引。正如你所说,这个DataFrame的索引无疑是“特殊的”。只是在这个函数的上下文中,将索引视为常规列会很方便,我想知道是否能够透明地实现。 - kuzzooroo
8
如果索引名称无法像其他列名一样使用,那么给索引命名的意义是什么呢?让人不禁感到疑惑。 - guibar
1
@guibar,你可以使用pd.DataFrame.query - jpp
4
这并不是一个真正的解决方案,你的回答超出了范围。那么你的意思是“不行,因为Pandas没有构建一种像列一样与索引交互的接口”。如果是,那就把这个作为答案。现在一个自然的后续问题是为什么不行?我们已经看到其他软件能够做到这一点,比如SQL。 - Keto
1
这不是对OP问题的回答,而是对问题存在的合理性进行辩解...作为一个使用pandas超过十年的用户,我仍然困惑于API为什么要以这种方式工作。 - william_grisaitis
显示剩余3条评论

19

如果您需要按名称访问(索引)列,还可以使用df.index.get_level_values。它也适用于分层索引(MultiIndex)。

>>> df.index.get_level_values('name')
Index(['a', 'b', 'c', 'd', 'e'], dtype='object', name='name')

这是否提供了一种访问形式,使得索引和其他命名列之间是不可知的,还是仅仅提供了一种涉及索引名称的不同访问方式? - kuzzooroo
这是后者 -- 它仅适用于索引列。 - Jongwook Choi

10

不必使用 reset_index,您可以将索引复制到普通列中,进行一些操作,然后删除该列。例如:

df['tmp'] = df.index
# do stuff based on df['tmp']
del df['tmp']

1
我也喜欢这个解决方案,毕竟列和索引有不同的用途,如果需要,就保留两者。 - Peruz

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