有人可以解释这两种切片方法有何不同吗?
我见过the docs ,
我见过 these answers ,但我仍然发现自己无法理解这三者有何不同。对我来说,它们在很大程度上似乎可以互换,因为它们处于较低的切片级别。
例如,假设我们想要获取 DataFrame
的前五行。 .这两个是如何工作的?
df.loc[:5]
df.iloc[:5]
有人可以提出三种用法区别更清楚的情况吗?曾几何时,我也想知道这两个功能和
df.ix[:5]
有什么区别但是 ix
已从 pandas 1.0 中删除,所以我不再关心了。
最佳答案
标签与位置
这两种方法的主要区别是:
loc
获取具有特定 的行(和/或列)标签 .iloc
获取整数 处的行(和/或列)地点 .为了演示,考虑一个系列
s
具有非单调整数索引的字符:>>> s = pd.Series(list("abcdef"), index=[49, 48, 47, 0, 1, 2])
49 a
48 b
47 c
0 d
1 e
2 f
>>> s.loc[0] # value at index label 0
'd'
>>> s.iloc[0] # value at index location 0
'a'
>>> s.loc[0:1] # rows at index labels between 0 and 1 (inclusive)
0 d
1 e
>>> s.iloc[0:1] # rows at index location between 0 and 1 (exclusive)
49 a
以下是 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
bool 数组一个行(包含
'f'
)同
loc
999
int 对象不在索引中KeyError
IndexError
(越界)-1
int 对象不在索引中KeyError
返回 s
中的最后一个值lambda x: x.index[3]
可调用应用于系列(此处返回索引中的第三项)s.loc[s.index[3]]
s.iloc[s.index[3]]
loc
的标签查询功能远远超出整数索引,值得强调几个额外的例子。这是一个索引包含字符串对象的系列:
>>> s2 = pd.Series(s.index, index=s.values)
>>> s2
a 49
b 48
c 47
d 0
e 1
f 2
自 loc
是基于标签的,它可以使用 s2.loc['a']
获取系列中的第一个值.它还可以使用非整数对象切片:>>> s2.loc['c':'e'] # all rows lying between 'c' and 'e' (inclusive)
c 47
d 0
e 1
对于 DateTime 索引,我们不需要传递确切的日期/时间来按标签获取。例如:>>> s3 = pd.Series(list('abcde'), pd.date_range('now', periods=5, freq='M'))
>>> s3
2021-01-31 16:41:31.879768 a
2021-02-28 16:41:31.879768 b
2021-03-31 16:41:31.879768 c
2021-04-30 16:41:31.879768 d
2021-05-31 16:41:31.879768 e
然后要获取 2021 年 3 月/4 月的行,我们只需要:>>> s3.loc['2021-03':'2021-04']
2021-03-31 17:04:30.742316 c
2021-04-30 17:04:30.742316 d
行和列loc
和 iloc
使用 DataFrame 的方式与使用 Series 的方式相同。需要注意的是,这两种方法都可以同时处理列和行。当给定一个元组时,第一个元素用于索引行,如果存在,第二个元素用于索引列。
考虑下面定义的 DataFrame:
>>> import numpy as np
>>> df = pd.DataFrame(np.arange(25).reshape(5, 5),
index=list('abcde'),
columns=['x','y','z', 8, 9])
>>> df
x y z 8 9
a 0 1 2 3 4
b 5 6 7 8 9
c 10 11 12 13 14
d 15 16 17 18 19
e 20 21 22 23 24
然后例如:>>> df.loc['c': , :'z'] # rows 'c' and onwards AND columns up to 'z'
x y z
c 10 11 12
d 15 16 17
e 20 21 22
>>> df.iloc[:, 3] # all rows, but only the column at index location 3
a 3
b 8
c 13
d 18
e 23
有时我们想为行和列混合标签和位置索引方法,以某种方式结合 loc
的功能。和 iloc
.例如,考虑以下 DataFrame。如何最好地将行切成并包括“c”并取前四列?
>>> import numpy as np
>>> df = pd.DataFrame(np.arange(25).reshape(5, 5),
index=list('abcde'),
columns=['x','y','z', 8, 9])
>>> df
x y z 8 9
a 0 1 2 3 4
b 5 6 7 8 9
c 10 11 12 13 14
d 15 16 17 18 19
e 20 21 22 23 24
我们可以使用 iloc
实现这个结果以及另一种方法的帮助:>>> df.iloc[:df.index.get_loc('c') + 1, :4]
x y z 8
a 0 1 2 3
b 5 6 7 8
c 10 11 12 13
get_loc()
是一个索引方法,意思是“获取标签在这个索引中的位置”。请注意,由于使用 iloc
进行切片不包括它的端点,如果我们还想要行 'c',我们必须给这个值加 1。
关于python - iloc 和 loc 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31593201/