如何使用pandas中浮点数索引的数据

时间:2014-07-04 15:03:18

标签: python pandas

我将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)

2 个答案:

答案 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