6

我特别在谈论 Pandas 0.11 版,因为我正忙着用 .loc 或 .iloc 替换我对 .ix 的使用。我喜欢这样一个事实,即区分 .loc 和 .iloc 可以传达我是打算按标签还是整数位置进行索引。我看到任何一个都将接受布尔数组,但我想保持它们的使用纯粹以清楚地传达我的意图。

4

2 回答 2

5

在 11.0 中,这三种方法都有效,文档中建议的方法是简单地使用df[mask]. 但是,这不是在位置上完成的,而是纯粹使用标签,所以在我看来,这loc最好地描述了实际发生的事情。

更新:我在github上问过这个问题,结论是df.iloc[msk]会在 pandas 中给出一个NotImplementedError(如果是整数索引掩码)或ValueError(如果是非整数索引)11.1

In [1]: df = pd.DataFrame(range(5), list('ABCDE'), columns=['a'])

In [2]: mask = (df.a%2 == 0)

In [3]: mask
Out[3]:
A     True
B    False
C     True
D    False
E     True
Name: a, dtype: bool

In [4]: df[mask]
Out[4]:
   a
A  0
C  2
E  4

In [5]: df.loc[mask]
Out[5]:
   a
A  0
C  2
E  4

In [6]: df.iloc[mask]  # Due to this question, this will give a ValueError (in 11.1)
Out[6]:
   a
A  0
C  2
E  4

也许值得注意的是,如果你给掩码整数索引,它会抛出一个错误:

mask.index = range(5)
df.iloc[mask]  # or any of the others
IndexingError: Unalignable boolean Series key provided

这表明 iloc 实际上并没有实现,它使用标签,因此为什么 11.1NotImplementedError在我们尝试这个时会抛出 a。

于 2013-05-17T10:08:56.897 回答
1

我目前正在使用[],即__getitem__(),例如

df = pd.DataFrame(dict(a=range(5)))
df[df.a%2==0]
于 2013-05-17T07:32:34.607 回答