【问题标题】:Start:stop slicing inconsistencies between numpy and Pandas?开始:停止切片 numpy 和 Pandas 之间的不一致?
【发布时间】:2013-03-01 00:47:37
【问题描述】:

我对 numpy 和 Pandas 之间的以下区别有点惊讶/困惑

import numpy as np
import pandas as pd
a = np.random.randn(10,10)

> a[:3,0, newaxis]

array([[-1.91687144],
       [-0.6399471 ],
       [-0.10005721]])

但是:

b = pd.DataFrame(a)

> b.ix[:3,0]

0   -1.916871
1   -0.639947
2   -0.100057
3    0.251988

换句话说,numpy 在start:stop 表示法中不包含stop 索引,但Pandas 包含。我认为 Pandas 是基于 Numpy 的。这是一个错误吗?故意的?

【问题讨论】:

  • 你为什么使用b.ix 而不仅仅是b[:3]

标签: python numpy pandas


【解决方案1】:

已记录在案,它是Advanced Indexing 的一部分。这里的关键是您根本没有使用停止索引。

ix 属性是一个特殊的东西,它可以让您按标签进行各种高级索引 - 选择标签列表,使用包含的标签范围而不是半独占范围索引和其他各种东西。

如果你不想要,就不要使用它:

In [191]: b[:3][0]
Out[191]: 
0   -0.209386
1    0.050345
2    0.318414
Name: 0

如果你在不阅读文档的情况下多玩这个,你可能会想出一个例子,你的标签是 'A', 'B', 'C', 'D' 而不是 0, 1, 2, 3,突然间,b.ix[:3] 将只返回3 行而不是 4 行,你会再次感到困惑。

不同之处在于,在这种情况下,b.ix[:3]indices 上的切片,而不是 labels 上的切片。

您在代码中要求的内容实际上在“所有标签不超过 3”和“所有索引不超过 3”之间是模棱两可的,标签总是以 ix 获胜(因为如果你不不想要标签切片,你不必首先使用ix)。这就是为什么我说问题在于您根本没有使用停止索引。

【讨论】:

  • 在您的示例中,它返回一个副本。您需要使用 .loc 或 .iloc 进行分配吗?
【解决方案2】:

当索引类型为整数时,DataFrame.ix 将仅使用基于标签的索引。根据文档,基于标签的切片将包括开始和停止。

http://pandas.pydata.org/pandas-docs/dev/indexing.html#advanced-indexing-with-labels

带有标签的切片在语义上略有不同,因为 在基于标签的情况下,切片开始和停止都包含在内。

带有整数轴标签的基于标签的索引是一个棘手的话题。它 已在邮件列表和各个成员之间进行了大量讨论 科学 Python 社区的成员。在 pandas 中,我们的一般观点 是标签比整数位置更重要。因此,与 整数轴索引仅基于标签的索引是可能的 .ix 等标准工具。以下代码会产生异常

【讨论】:

    【解决方案3】:

    发件人(docs):

    切片具有整数切片的标准 Python 语义

    ...

    带有标签的切片在语义上略有不同,因为 在基于标签的情况下,切片开始和停止都包含在内。

    【讨论】:

    • 对,但是如何让基于标签的切片在一端独占(就像普通的 python 切片一样!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2018-09-22
    • 2012-07-03
    • 1970-01-01
    • 2020-10-30
    相关资源
    最近更新 更多