来自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不同。这是否适用于此行,是否包含行但不包括列?
有人可以解释一下这种行为及其背后的基本原理吗?
答案 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
。
理由是,它正在努力帮助你。与软件假设你的意图的大多数事情一样,它会产生意想不到的后果。在命名范围内找到标签的地方,它会在两端进行包含性选择,因为这是您在分析数据时通常需要的内容