键错误和多索引词汇排序深度

2024-05-19 11:04:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一组以制表符分隔的文件,我必须仔细阅读它们,将它们用作pandas数据框,对它们执行一系列操作,然后将它们合并回一个excel文件,代码太长,所以我将仔细研究其中有问题的部分

我正在分析的tab文件包含所有相同数量的行2177

当我读取这些文件时,我正在按类型(string,int)的前两列进行索引

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)'

我到处搜索,似乎这是排序索引的问题,但我不明白为什么使用未排序的子集不会导致问题

你知道我该怎么解决这个问题吗?

谢谢


Tags: 文件数据sample代码idpandasdfdata
1条回答
网友
1楼 · 发布于 2024-05-19 11:04:12

医生很好。如果使用多个索引,那么通读(多次!),请参见here

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)

相关问题 更多 >

    热门问题