在行和列不同的pandas中整数切片?

时间:2015-12-28 13:13:45

标签: python pandas

来自R我尝试围绕pandas数据帧的整数切片。 令我困惑的是使用相同整数/切片表达式的行和列的不同切片行为。

import pandas as pd

x = pd.DataFrame({'a': range(0,6),
               'b': range(7,13),
               'c': range(14, 20)})
x.ix[0:2, 0:2]   # Why 3 x 2 and not 3 x 3 or 2 x 2?

    a   b
0   0   7
1   1   8
2   2   9

我们得到3行但只有2列。在文档中,我发现与标准python windows web portal不同。这是否适用于此行,是否包含行但不包括列?

有人可以解释一下这种行为及其背后的基本原理吗?

2 个答案:

答案 0 :(得分:3)

您是正确的,基于标签的索引基于位置的索引之间存在区别。第一个包括结束标签,而典型的基于python位置的切片不包括最后一个项目。

在您给出的示例中:x.ix[0:2, 0:2]根据标签对行进行切片,因此包含“2”(返回3行),而根据位置对列进行切片,因此仅返回2列

如果你想要保证基于位置的切片(在这种情况下返回2x2帧),iloc是要使用的索引器:

In [6]: x.iloc[0:2, 0:2]
Out[6]:
   a  b
0  0  7
1  1  8

对于基于保证位置的切片,您可以使用loc索引器 您正在使用的ix索引器更灵活(索引类型不严格)。它主要基于标签,但会回退到基于位置(当找不到标签而你使用整数时)。在您的示例中,列就是这种情况。出于这个原因,建议始终使用loc / iloc代替ix (除非您需要基于混合标签/位置的索引)。

有关不同类型的索引器的更详细概述,请参阅文档:http://pandas.pydata.org/pandas-docs/stable/indexing.html#different-choices-for-indexing

答案 1 :(得分:1)

,ix方法主要基于标签,后备索引...来自在线文档......

主要基于标签位置的索引器,具有整数位置 回退。

.ix[]支持基于混合整数和标签的访问。它是 主要基于标签,但将回退到整数位置 访问,除非相应的轴是整数类型。

.ix是最常用的索引器,支持任何一个 .loc.iloc中的输入。 .ix也支持浮动 点标签计划。交易时.ix特别有用 基于位置和标签的混合分层指数。

但是,当轴是基于整数的时,仅限基于标签的访问 而不支持位置访问。因此,在这种情况下,它就是这样 通常最好明确并使用.iloc.loc

理由是,它正在努力帮助你。与软件假设你的意图的大多数事情一样,它会产生意想不到的后果。在命名范围内找到标签的地方,它会在两端进行包含性选择,因为这是您在分析数据时通常需要的内容