.loc 用于 Pandas 中的 CategoricalIndex

man*_*anu 5 python pandas

我正在尝试使用 .loc 访问基于 CategoricalIndex 的 Pandas 数据框的行,但我得到了一个TypeError. 一个最小的工作示例是

import pandas as pd

df = pd.DataFrame({'foo': rand(3), 'future_index': [22, 13, 87]})
df['future_index'] = df['future_index'].astype('category')
df = df.set_index('future_index')
Run Code Online (Sandbox Code Playgroud)

然后,在尝试访问与标签 13 对应的行时

df.loc[13]
Run Code Online (Sandbox Code Playgroud)

我得到

TypeError: cannot do label indexing on <class 'pandas.core.indexes.category.CategoricalIndex'> with these indexers [13] of <class 'int'>
Run Code Online (Sandbox Code Playgroud)

尽管

13 in df.index
Run Code Online (Sandbox Code Playgroud)

正在True。我知道我最终可以获得 13 的索引

df.index.get_loc(13)
Run Code Online (Sandbox Code Playgroud)

但是,为什么上述更简单的方法不起作用?我错过了什么?

干杯。

jez*_*ael 3

对我来说工作:

print (df.loc[pd.CategoricalIndex([13])])
              foo
future_index     
13              2
Run Code Online (Sandbox Code Playgroud)

但如果转换为str前面提到的EdChum,效果会很好:

df = pd.DataFrame({'foo': [1,2,3], 'future_index': [22, 13, 87]})
df['future_index'] = df['future_index'].astype(str).astype('category')
df = df.set_index('future_index')
print (df)

print (df.loc['13'])
foo    2
Name: 13, dtype: int64
Run Code Online (Sandbox Code Playgroud)