如何检查 Pandas 的每个级别的多索引类型?
我正在尝试访问特定级别,以检查其类型是否是我想要的类型,如果不是,则将其转换为 int
类型。
我尝试过df.index.info()
但没有成功。我还检查了 API Reference 中描述的方法和属性,尽管我没有看到任何提及。
最佳答案
设置
idx = pd.MultiIndex.from_product([range(2), [*'XY']], names=['lvl0', 'lvl1'])
df = pd.DataFrame(1, idx, idx)
df
lvl0 0 1
lvl1 X Y X Y
lvl0 lvl1
0 X 1 1 1 1
Y 1 1 1 1
1 X 1 1 1 1
Y 1 1 1 1
<小时/>
多索引的基本剖析
级别
是 pandas.Index
对象的frozenlist
。这些 pandas.Index
对象中的每一个都应该包含唯一的值。如果这些级别索引对象不是唯一的,则某些内容可能已损坏。
[*map(type, df.index.levels)]
[pandas.core.indexes.numeric.Int64Index, pandas.core.indexes.base.Index]
你可以得到他们的dtype
[l.dtype for l in df.index.levels]
[dtype('int64'), dtype('O')]
<小时/>
标签
这是数组的frozenlist
。每个级别索引都有一个标签数组。相应的标签数组包含对正在显示的级别值的引用。
[*map(type, df.index.labels)]
[pandas.core.indexes.frozen.FrozenNDArray,
pandas.core.indexes.frozen.FrozenNDArray]
<小时/>
print(*df.index.labels, sep='\n')
FrozenNDArray([0, 0, 1, 1], dtype='int8')
FrozenNDArray([0, 1, 0, 1], dtype='int8')
<小时/>
获取级别值
您可以使用 get_level_values
访问索引中的值
df.index.get_level_values(1)
Index(['X', 'Y', 'X', 'Y'], dtype='object', name='lvl1')
这与使用 label
对象切片 level
对象相同
df.index.levels[1][df.index.labels[1]]
Index(['X', 'Y', 'X', 'Y'], dtype='object', name='lvl1')
关于python - 检查并转换多索引类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53414342/