每当我尝试在具有分层索引的数据帧上为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'
答案 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