像普通列一样访问 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 索引的主要内容,如果未能解决你的问题,请参考以下文章