我将pandas DataFrame
与hierarhical索引一起使用,并且在一个特定情况下,它由float值索引。
以下是示例:
example_data = [
{'a': 1.2, 'b':30, 'v':123},
{'a': 1.2, 'b':60, 'v':1234},
{'a': 3, 'b':30, 'v':12345},
{'a': 3, 'b':60, 'v':123456},
]
frame = pd.DataFrame(example_data)
frame.set_index(['a', 'b'])
现在我想使用部分索引来选择a==1.2
的帧,然后显示它。文档显示了如何为string index执行此操作,但这种方法显然不适用于浮点数,无论我是否尝试frame.loc[1.2]
我都会得到关于1.2 Int64Index
非常重要的错误,这显然是正确的因为我使用float进行索引。
有没有办法在pandas中使用float索引?如何修复我的Hierarhical Index?
实际错误消息是:
TypeError: the label [1.2] is not a proper indexer for this index type (Int64Index)
答案 0 :(得分:1)
如果索引级别是单个级别而不是多索引,Pandas没有问题:
In [178]:
frame = frame.set_index(['a'])
frame.loc[1.2]
Out[178]:
b v
a
1.2 30 123
1.2 60 1234
如果你有一个多索引,那么你可以使用索引级别0(第一个)生成一个掩码,并使用它来选择值:
In [180]:
mask = frame.index.get_level_values(0)
frame.loc[mask == 1.2]
Out[180]:
v
a b
1.2 30 123
60 1234
掩码本身包含每行的所有0级值:
In [181]:
mask
Out[181]:
Float64Index([1.2, 1.2, 3.0, 3.0], dtype='float64')
使用名称指定级别更好,更明确:
mask = frame.index.get_level_values('a')
答案 1 :(得分:1)
在尝试类似操作的同时也可以解决这个问题,并且没有任何问题。熊猫库已得到改进,或者set_index中缺少适当的位置(或赋值)。
example_data = [
{'a': 1.2, 'b':30, 'v':123},
{'a': 1.2, 'b':60, 'v':1234},
{'a': 3, 'b':30, 'v':12345},
{'a': 3, 'b':60, 'v':123456},
]
frame = pd.DataFrame(example_data)
f2 = frame.set_index(['a', 'b']) # <<<<<<<<<
print(f2)
v
a b
1.2 30 123
60 1234
3.0 30 12345
60 123456
现在f2.loc [1.2]有效。
print(f2.loc[1.2])
v
b
30 123
60 1234