【问题标题】:Trouble with using iloc in pandas dataframe with hierarchical index在具有分层索引的熊猫数据框中使用 iloc 时遇到问题
【发布时间】:2013-11-29 17:57:24
【问题描述】:

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

【问题讨论】:

  • 我认为这是一个错误。

标签: python python-2.7 pandas


【解决方案1】:

这是 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

【讨论】:

  • 太棒了,谢谢,我搜索了跟踪器,但没有找到。也忘记了 ix 方法:)
【解决方案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

【讨论】:

  • 我需要访问一个不连续的行号列表。如果数据帧索引不是分层的,我可以用 iloc 做到这一点。但是使用分层索引,我得到了我提到的错误。这是已知的 Pandas 错误吗?
  • @user2205 不知道。在答案中添加了我找到的唯一的 w/around
猜你喜欢
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2017-06-08
相关资源
最近更新 更多