键错误和MultiIndex的lexsort深度
我有一组用制表符分隔的文件,需要逐个读取它们,使用 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)