如何在pandas中处理浮点索引的数据

10 投票
2 回答
11807 浏览
提问于 2025-04-18 12:07

我在使用 pandas 的 DataFrame,它有层级索引。在某个特定的情况下,它是用浮点数来索引的。

这里有个例子:

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 的数据框,然后显示出来。文档里有说明如何对 字符串索引 进行操作,但这种方法显然不适用于浮点数。无论我尝试 frame.loc[1.2],都会报错,提示 1.2 对于 Int64Index 不合适,这显然是对的,因为我用的是浮点数来索引。

有没有办法在 pandas 中处理浮点数索引呢?我该如何修复我的层级索引?

实际的错误信息是:

TypeError: the label [1.2] is not a proper indexer for this index type (Int64Index)

2 个回答

1

我在尝试类似的事情时遇到了这个问题,结果顺利解决了。要么是pandas库有了改进,要么就是你在使用set_index时漏掉了inplace(或赋值)。

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
4

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

如果你有多层索引的话,可以通过使用第一层索引(也就是索引的第一个层级)来生成一个筛选条件,然后用这个条件来选择你想要的值。

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

这个筛选条件本身包含了每一行的所有第一层索引的值。

In [181]:

mask
Out[181]:
Float64Index([1.2, 1.2, 3.0, 3.0], dtype='float64')

更好且更清楚的做法是通过名称来指定索引层级。

mask = frame.index.get_level_values('a')

撰写回答