使用带有分层索引的pandas数据帧中的iloc时出现问题

时间:2013-11-16 08:22:44

标签: python python-2.7 pandas

每当我尝试在具有分层索引的数据帧上为iloc提供列表时,我就会收到此ValueError。我不确定我做错了什么或者这是一个错误。我对使用非分层索引的方法使用iloc没有任何问题。这是使用Pandas 0.12.0。

In [25]: df
Out[25]: 
            D         E         F
a x -1.050681 -0.084306 -1.635852 
  y  1.544577  1.594976 -0.084866
b x  0.462529 -1.873250  1.252685
  y -0.468074  0.673112 -0.900547
c x  0.901710 -0.432554  0.260157
  y  0.101522 -0.550223  1.389497

In [26]: df.iloc[[1,3]]
..... snip .....
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

In [27]: df.iloc[range(2)]
...... snip .....
ValueError: Buffer dtype mismatch, expected 'Python object' but got 'long'

2 个答案:

答案 0 :(得分:4)

这是a bug并已在master(0.13)中修复,暂时的解决方法是使用ix(!):

In [11]: df1.ix[[1, 3]]
Out[11]: 
            D         E         F
a y  1.544577  1.594976 -0.084866
b y -0.468074  0.673112 -0.900547

在硕士中,0.13:

In [12]: df1.iloc[[1, 3]]
Out[12]: 
            D         E         F
a y  1.544577  1.594976 -0.084866
b y -0.468074  0.673112 -0.900547

答案 1 :(得分:2)

似乎pandas无法将[[1,3]]转换为正确的MultiIndex。您可能想要填写pandas issues tracker中的错误。我找到的唯一解决方法是手动构建它,这样就可以按原样传递。

>>> tup = zip(*[['a','a','b','b'],['x','y','x','y']])
>>> index = pd.MultiIndex.from_tuples(tup, names=['f','s'])
>>> df = pd.DataFrame(np.random.randn(4, 4))
>>> df
            0         1         2         3
f s
a x -0.334280  0.479317 -0.358416 -0.245807
  y  1.279348 -0.096336  0.100285  0.037231
b x -0.368452  0.219868 -0.103722 -0.575399
  y -0.813583 -0.042694  0.897361  1.636304
>>> idx = [i in [1,3] for i in range(len(df.index))]
>>> idx
[False, True, False, True]
>>> df.iloc[idx]
            0         1         2         3
f s
a y  1.279348 -0.096336  0.100285  0.037231
b y -0.813583 -0.042694  0.897361  1.636304

其他方法是使用get_level_values按级别访问MultiIndex

>>> df.iloc[df.index.get_level_values('f') == 'a']
            0         1         2         3
f s
a x -0.334280  0.479317 -0.358416 -0.245807
  y  1.279348 -0.096336  0.100285  0.037231

相反,切片正确转换为MultiIndex:

>>> df.iloc[0:2,:]
           0         1         2         3
f s
a x -0.33428  0.479317 -0.358416 -0.245807
a y  1.279348 -0.096336  0.100285  0.037231