pandas - rename_axis 之后无法按预期工作 - 为什么?

pandas - rename_axis doesn't work as expected afterwards - why?

我正在阅读 pandas 文档(10 分钟到 pandas)并遇到了这个例子:

dates = pd.date_range('1/1/2000', periods=8)

df = pd.DataFrame(np.random.randn(8, 4),
              index=dates, columns=['A', 'B', 'C', 'D'])

s = df['A']

s[dates[5]] 
# Out[5]: -0.6736897080883706

这很合逻辑,但如果我自己尝试并在之后设置索引名称(示例如下),那么我无法 select 使用 s[dates[5]] 的数据。有人知道为什么吗?

例如

df = pd.read_csv("xyz.csv").head(100) 
s = df['price'] # series with unnamed int index + price
s = s.rename_axis('indexName')
s[indexName[5]] # NameError: name 'indexName' is not defined

提前致谢!

编辑:s.index.name returns indexName,尽管没有使用 s[indexName[5]]

的调用

您混淆了索引名称和索引值。

在你的例子中,第一个代码块 运行s 因为 dates 是一个变量,所以当你调用 dates[5] 它实际上是 returns 来自dates 对象,它是数据框中的有效索引值。

在您自己的尝试中,您指的是切片内的 indexName(即当您尝试 运行 s[indexName[5]] 时),但 indexName 不是环境中的变量,因此它会抛出错误。

对系列或数据框的部分进行子集化的正确方法是引用索引的实际值,而不是轴的名称。例如,如果您有如下系列:

s = pd.Series(range(5), index=list('abcde'))

那么索引中的值是 ae,因此要对该系列进行子集化,您可以使用:

s['b']

或:

s.loc['b']

另请注意,如果您更喜欢按位置而不是索引值访问元素,则可以使用 .iloc 方法。所以要获得第二个元素,你可以使用:

s.iloc[1] # locations 0 is the first element

希望它有助于澄清。我建议您继续学习一些介绍性的 pandas 教程,以建立基本的理解。

首先让我们理解这个例子:

df[index] 用于 select 具有 index.
的行 这是 s 数据框:

索引是日期。

dates[5] 等于 '2000-01-06',它是 s df 的第 5 行的索引。因此,结果是具有该索引的行。

在您的代码中:

indexName 未定义。所以,indexName[5] 不代表你的 df 的索引。