如何在pandas中处理浮点索引的数据
我在使用 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')