从电子表格访问DataFrame中的MultiIndex时出错

时间:2016-03-23 21:49:11

标签: python python-2.7 pandas

这很难确定,但似乎我无法在使用pandas.read_excel的电子表格中读取的数据框中使用多索引。我已将所有文件放在Gist

df = pd.read_excel('small.xlsx')
df.set_index(['qrsid','locus'], inplace=True)
print(('dkdkd', 'kdkd') in df.index)

产生错误,

Traceback (most recent call last):
  File "mindex.py", line 14, in <module>
    print(('dkdkd', 'kdkd') in df.index)
  File "/path/venv/local/lib/python2.7/site-packages/pandas/indexes/multi.py", line 947, in __contains__
    self.get_loc(key)
  File "/path/venv/local/lib/python2.7/site-packages/pandas/indexes/multi.py", line 1538, in get_loc
    if lead_key else (0, len(self)))
  File "/path/venv/local/lib/python2.7/site-packages/pandas/indexes/multi.py", line 1444, in slice_locs
    return super(MultiIndex, self).slice_locs(start, end, step, kind=kind)
  File "/path/venv/local/lib/python2.7/site-packages/pandas/indexes/base.py", line 2879, in slice_locs
    start_slice = self.get_slice_bound(start, 'left', kind)
  File "/path/venv/local/lib/python2.7/site-packages/pandas/indexes/multi.py", line 1415, in get_slice_bound
    return self._partial_tup_index(label, side=side)
  File "/path/venv/local/lib/python2.7/site-packages/pandas/indexes/multi.py", line 1460, in _partial_tup_index
    raise TypeError('Level type mismatch: %s' % lab)
TypeError: Level type mismatch: dkdkd

从pandas原语创建的具有多索引的类似数据帧工作正常,

df = pd.DataFrame({'qrsid':['qb210', 'qb210', 'qb210', 'qb210', 'qb210'],
                'locus':['gag','gag','gag','gag','gag'],
                'dpi': [ 800, 1002, 2291, 4444, 212]})
df.set_index(['qrsid','locus'], inplace=True)
print(('dkdkd', 'kdkd') in df.index)

我无法弄清楚两个数据帧之间有什么不同。两者都有相同的df.dtypesdf.index两者看起来完全相同。任何人都可以告诉我为什么访问第一个索引失败?

$ python --version
Python 2.7.6
$ python -c 'import pandas; print pandas.__version__'
0.18.0

1 个答案:

答案 0 :(得分:0)

我想我知道为什么会发生这种情况。我在pandas.indexes.base.Index.is_type_compatible

中打印出要比较的类型
is_type_compatible: kind=string   inferred_type=unicode

显然pandas.read_excel()正在将字符串作为unicode读取,并且这些字符串与简单的&#39;字符串不兼容。

此处的索引错误消息可能是更多信息。只是告诉我&#39;等级类型不匹配&#39;提供几乎没有有用的信息。