pandas多重索引切片“层级类型不匹配”

6 投票
1 回答
6283 浏览
提问于 2025-05-10 15:14

我把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')]

撰写回答