有人可以解释这两种切片方法有何不同吗?
我看过 文档,也看过 这些 答案,但我仍然发现自己无法理解这三者有何不同。对我来说,它们在很大程度上似乎可以互换,因为它们处于较低的切片级别。
例如,假设我们想要获取 a DataFrame
的前五行。这两个是如何工作的?
df.loc[:5]
df.iloc[:5]
有人可以提出三种使用区别更清楚的情况吗?
曾几何时,我也想知道这两个函数与 df.ix[:5]
但是 ix
已从 pandas 1.0 中删除,所以我不再关心了。
原文由 AZhao 发布,翻译遵循 CC BY-SA 4.0 许可协议
标签 与 位置
两种方法的主要区别在于:
loc
获取具有特定 标签 的行(和/或列)。iloc
在整数 位置 获取行(和/或列)。为了演示,考虑一系列
s
具有非单调整数索引的字符:以下是传递各种对象时
s.loc
和s.iloc
之间的一些差异/相似之处:<对象>描述
s.loc[<object>]
s.iloc[<object>]
0
单品索引 标签 处的值0
(字符串'd'
)索引 位置 0 处的值(字符串'a'
)0:1
片两 行(标签0
和1
)一行(位置 0 处的第一行)1:47
越界切片零 行(空系列)五行(位置 1 起)1:47:-1
带负步的切片三行(标签1
回到47
)零 行(空系列)[2, 0]
整数列表具有给定标签的 两 行具有给定位置的 两 行s > 'e'
Bool系列(表示哪些值具有该属性)一 排(包含'f'
)NotImplementedError
(s>'e').values
布尔数组一 排(包含'f'
)与loc
相同999
int 对象不在索引中KeyError
IndexError
(越界)-1
int 对象不在索引中KeyError
返回最后一个值s
lambda x: x.index[3]
可调用应用于系列(此处返回索引中的第3项)s.loc[s.index[3]]
s.iloc[s.index[3]]
loc
的标签查询功能远远超出了整数索引,值得强调几个额外的例子。这是一个系列,其中索引包含字符串对象:
由于
loc
是基于标签的,它可以使用s2.loc['a']
获取系列中的第一个值。它还可以使用非整数对象进行切片:对于 DateTime 索引,我们不需要传递确切的日期/时间来按标签获取。例如:
然后要获取 2021 年 3 月/4 月的行,我们只需要:
行和列
loc
和iloc
使用 DataFrame 的方式与使用 Series 的方式相同。值得注意的是,这两种方法都可以同时处理列和行。当给定一个元组时,第一个元素用于索引行,如果存在,则第二个元素用于索引列。
考虑下面定义的 DataFrame:
那么例如:
有时我们想为行和列混合标签和位置索引方法,以某种方式结合
loc
和iloc
的功能。例如,考虑以下 DataFrame。如何最好地将包含“c”的行切片 并 获取前四列?
我们可以使用
iloc
和另一种方法的帮助来实现这个结果:get_loc()
是一个索引方法,意思是“获取标签在这个索引中的位置”。请注意,由于使用iloc
进行切片不包括其端点,因此如果我们也需要行“c”,则必须将此值加 1。