Python Series分层索引部分索引报错原因咨询
为什么分层索引切片会触发UnsortedIndexError?
这个问题的核心在于你的MultiIndex没有按层级做字典序排序,而pandas的范围切片(比如['a':'c']这类操作)依赖有序索引才能正常工作。
先看第一个能正常运行的案例
你的第一个Series sr,它的第一层索引是严格按a→b→c→d→e→f的字典序排列的,而且相同的标签(比如b、d)都是连续出现的。这种情况下,pandas会自动识别出索引是经过**lexsort(字典序排序)**的,lexsort depth为1(表示第一层索引是有序的),所以sr['a':'c']可以准确定位从a到c的所有行。
再看报错的案例
而修改后的hs,第一层索引是['a','a','b','b','c','c','d','e','e','a']——注意最后又出现了一个a!这就把原本连续的a标签拆分成了开头和结尾两部分,彻底破坏了索引的字典序。此时pandas的MultiIndex没有被排序,lexsort depth为0(没有任何层级是有序的)。
pandas的范围切片(x:y)需要索引是有序的,这样它才能快速确定哪些行属于x到y的区间。如果索引乱序,相同标签分散在不同位置,pandas无法判断哪些行应该被包含在切片范围内,所以就会抛出UnsortedIndexError,提示你索引没有排序,无法执行这种切片操作。
解决方法
只需要先对hs的索引进行排序,再执行切片即可:
hs_sorted = hs.sort_index() print(hs_sorted['a':'c'])
排序后,MultiIndex会按层级恢复字典序,lexsort depth变回1,切片操作就能正常工作了。
内容的提问来源于stack exchange,提问作者jahanxb
相关产品推荐
相关产品推荐

