键错误和MultiIndex的lexsort深度

9 投票
1 回答
15907 浏览
提问于 2025-04-18 14:32

我有一组用制表符分隔的文件,需要逐个读取它们,使用 pandas 数据框进行一系列操作,然后再把它们合并成一个 Excel 文件。因为代码太长了,所以我只会讲解其中有问题的部分。

这些制表符文件的行数都是一样的,都是 2177 行。

在读取这些文件时,我是用前两列作为索引,类型分别是字符串和整数。

df = df.set_index(['id', 'coord'])
data = OrderedDict()
#data will contain all the information I am writing to excel
data[filename_id] = df

我有一个过程需要访问每一行的数据[sample_id],这个数据包含了一个混合类型的数据框,索引是 'id' 和 'coord' 这两列,像这样:

sample_row = data[sample].ix[index]

我的索引是 ('id','coord')

如果我只处理文件的一部分,所有操作都很顺利,但如果我读取整个 2177 行的文件,就会出现错误信息。

KeyError: 'Key length (2) was greater than MultiIndex lexsort depth (0)'

我在 StackOverflow 和其他地方搜索过,似乎这是索引排序的问题,但我不明白为什么使用一个未排序的子集不会导致这个问题。

有没有什么办法可以解决这个问题呢?

谢谢!

1 个回答

7

文档写得很好。如果你在使用多重索引,建议仔细阅读几遍,看看这个链接:这里

In [9]: df = DataFrame(np.arange(9).reshape(-1,1),columns=['value'],index=pd.MultiIndex.from_product([[1,2,3],['a','b','c']],names=['one','two']))

In [10]: df
Out[10]: 
         value
one two       
1   a        0
    b        1
    c        2
2   a        3
    b        4
    c        5
3   a        6
    b        7
    c        8

In [11]: df.index.lexsort_depth
Out[11]: 2

In [12]: df.sortlevel(level=1)
Out[12]: 
         value
one two       
1   a        0
2   a        3
3   a        6
1   b        1
2   b        4
3   b        7
1   c        2
2   c        5
3   c        8

In [13]: df.sortlevel(level=1).index.lexsort_depth
Out[13]: 0

In [9]: df = DataFrame(np.arange(9).reshape(-1,1),columns=['value'],index=pd.MultiIndex.from_product([[1,2,3],['a','b','c']],names=['one','two']))

In [10]: df
Out[10]: 
         value
one two       
1   a        0
    b        1
    c        2
2   a        3
    b        4
    c        5
3   a        6
    b        7
    c        8

In [11]: df.index.lexsort_depth
Out[11]: 2

In [12]: df.sortlevel(level=1)
Out[12]: 
         value
one two       
1   a        0
2   a        3
3   a        6
1   b        1
2   b        4
3   b        7
1   c        2
2   c        5
3   c        8

In [13]: df.sortlevel(level=1).index.lexsort_depth
Out[13]: 0

更新

sortlevel 这个功能将会被淘汰,所以请使用 sort_index,也就是

df.sort_index(level=1)

撰写回答