具有重复索引的ix选择的不一致行为

时间:2014-09-30 21:37:47

标签: python pandas

考虑一下pandas数据框

df = DataFrame({'somedata': [13,24,54]}, index=[1,1,2])

    somedata
1   13
1   24
2   54

执行

df.ix[1, 'somedata']

将返回一个对象

1    13
1    24
Name: somedata, dtype: int64

有一个索引:

df.ix[1, 'somedata'].index
Int64Index([1, 1], dtype='int64')

然而,执行

df.ix[2, 'somedata']

将只返回54号,它没有索引:

df.ix[2, 'somedata'].index
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-274-3c6e4b1e6441> in <module>()
----> 1 df.ix[2, 'somedata'].index

AttributeError: 'numpy.int64' object has no attribute 'index'

我不明白这个(貌似?)不一致的行为。这是故意的吗?我希望从同一个操作返回的对象具有相同的结构。此外,我需要围绕这个问题构建我的代码,所以我的问题是,如何检测ix选择返回的对象类型?目前我正在检查返回的对象的len。我想知道是否有更优雅的方式,或者是否可以强制选择,而不是仅返回数字54,以返回类似的形式

2    54
Name: somedata, dtype: int64

很抱歉,如果这是一个愚蠢的问题,我无法在任何地方找到答案。

1 个答案:

答案 0 :(得分:4)

如果您传递索引列表而不是单个索引,则可以保证您将返回系列。换句话说,而不是

>>> df.loc[1, 'somedata']
1    13
1    24
Name: somedata, dtype: int64
>>> df.loc[2, 'somedata']
54

你可以使用

>>> df.loc[[1], 'somedata']
1    13
1    24
Name: somedata, dtype: int64
>>> df.loc[[2], 'somedata']
2    54
Name: somedata, dtype: int64

(请注意,使用loc(或iloc)而不是ix通常更好一点,因为它不那么神奇,尽管不是{&# 39;在这里引起你的问题的原因。)