pandas多重索引切片“层级类型不匹配”
我把pandas从0.13.1版本升级到了0.17版本,现在在切片的时候遇到了一些新的错误。
>>> df
date int data
0 2014-01-01 0 0
1 2014-01-02 1 -1
2 2014-01-03 2 -2
3 2014-01-04 3 -3
4 2014-01-05 4 -4
5 2014-01-06 5 -5
>>> df.set_index("date").ix[datetime.date(2013,12,30):datetime.date(2014,1,3)]
int data
date
2014-01-01 0 0
2014-01-02 1 -1
2014-01-03 2 -2
>>> df.set_index(["date","int"]).ix[datetime.date(2013,12,30):datetime.date(2014,1,3)]
Traceback (most recent call last):
...
TypeError: Level type mismatch: 2013-12-30
在0.13.1版本下切片是没问题的,这个错误似乎是和带有日期的多重索引有关。我是不是做错了什么?
相关文章:
- 暂无相关问题
1 个回答
3
这个错误发生是因为你试图在不包含在索引中的日期(标签)上进行切片。要解决这个“级别不匹配”的错误,并返回可能在数据框多重索引中范围内的值,可以使用:
df.loc[df.index.get_level_values(level = 'date') >= datetime.date(2013,12,30)]
# You can use a string also i.e. '2013-12-30'
get_level_values()
和比较操作符会为索引器设置一个真/假(True/False)的索引值掩码。
在Pandas中,使用字符串或日期对象进行切片通常在单一索引时是有效的,无论字符串是否在索引中,但在多重索引的数据框中就不行了。虽然你尝试通过datetime.date(2013,12,30) : datetime.date(2014,1,3)的set_index调用来设置从2013-12-30到2014-01-03的索引,但结果数据框的索引却是从2014-01-01到2014-01-03。要正确设置包含2013-12-30这些日期的索引,可以使用字符串来设置日期范围,例如:
df.set_index("date").loc[pd.date_range('2013-12-30', '2014-12-03')]