像普通列一样访问 Pandas 索引

Posted

技术标签:

【中文标题】像普通列一样访问 Pandas 索引【英文标题】:Accessing a Pandas index like a regular column 【发布时间】:2019-02-07 21:44:48 【问题描述】:

我有一个带有命名索引的 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 中具有特殊的含义。它用于优化特定操作,可用于合并/加入数据等各种方法。因此,做出选择:

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

我们无法为您做出此选择。它应该取决于您的基础数据的结构以及您打算如何分析数据。

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

What is the performance impact of non-unique indexes in pandas? What is the point of indexing in pandas?

【讨论】:

假设我有一个库函数,它接受一个 DataFrame 并基于它创建一个散点图。它根据您选择的列标记图中的点,当前指定为字符串。现在出现了一个用例,标签基于某个 DataFrame 的索引会很有用。正如你所说,这个DataFrame的索引无疑是特殊的。只是在这个函数的上下文中,将索引视为常规列会很方便,我想知道它是否可以透明地完成。 @kuzzooroo,我建议您向a separate question 询问您面临的问题minimal reproducible example。例如,您在问题中给出的示例并没有显示使用df.index 有任何问题。 pd.Index 对象可用的方法与pd.Series 对象可用的方法不同,因此我们需要查看您的代码以确定问题。 如果不能像其他列名一样使用索引,那么给索引命名有什么意义...... @guibar,你可以用pd.DataFrame.query 这不是真正的解决方案,您的答案超出了范围。所以你的意思是“不,这是不可能的,因为 Pandas 没有构建一个接口来像列一样交互索引”。如果是,那就让这成为答案。现在一个自然的后续问题是为什么不呢?我们已经看到其他软件能够做到这一点,比如 SQL。【参考方案2】:

您可以不使用reset_index,而是将索引复制到普通列,做一些工作然后删除该列,例如:

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

【讨论】:

我也喜欢这个解决方案,最后列和索引有不同的用途,如果需要就保留两者。【参考方案3】:

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

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

【讨论】:

以上是关于像普通列一样访问 Pandas 索引的主要内容,如果未能解决你的问题,请参考以下文章

pandas.DataFrame.loc好慢,怎么遍历访问DataFrame比较快

Pandas库01_Series数据类型

Pandas - 索引操作

DataFrame

mysql基础之索引

mmap