【发布时间】:2018-10-02 09:32:15
【问题描述】:
由于某种原因,以下 2 次对 iloc / loc 的调用会产生不同的行为:
>>> import pandas as pd
>>> df = pd.DataFrame(dict(A=range(3), B=range(3)))
>>> df.iloc[:1]
A B
0 0 0
>>> df.loc[:1]
A B
0 0 0
1 1 1
我知道loc 考虑行标签,而iloc 考虑行的基于整数的索引。但是为什么loc 调用的上限被认为是包容的,而iloc 的上限被认为是独占的?
【问题讨论】:
-
想想
list(range(1)),只会返回0,.iloc会选择多于(而不是少) -
他们还在documentation 中明确指定了此行为。在
.loc文档下方:“◦带有标签'a':'f'的切片对象,(请注意,与通常的python切片相反,开始和停止都包括在内!)” -
真正的“答案”应该是
loc应该是一个允许指定数字或名称的函数。我试图发布一个用例,说明为什么这是一个大问题(简而言之,我们经常希望使用数字行和列名),但该帖子立即被删除,因为这是一个“重复”。这是熊猫的大问题!它会导致许多错误和丑陋的代码。 -
嘿@MikeWilliamson - 如果它们被合并,您希望它们的切片是端独占还是端端包含?
-
@ASGM 我觉得它应该与所有其他 Python 样式匹配:它是包含开头和结尾的。例如,
list(range(2,9))是[2, 3, 4, 5, 6, 7, 8]。我觉得所有 Python 库都应该遵循 Python 的标准,这将导致对 Principle of Least Astonishment 的最佳适应。
标签: python pandas dataframe slice