有人可以解释这三种切片方法有何不同吗?
我看过文档,也看过这些 答案,但是我仍然发现自己无法解释这三者之间的区别。在我看来,它们在很大程度上似乎是可互换的,因为它们处于切片的较低级别。
例如,假设我们要获取的前五行DataFrame
。这三者如何运作?
df.loc[:5]
df.ix[:5]
df.iloc[:5]
有人可以提出三种用法之间的区别更清楚的情况吗?
注意:在熊猫版本0.20.0及更高版本中,ix
已弃用,建议改为使用loc和iloc。我留下了ix完整的答案部分,以供早期版本的熊猫用户参考。下面html" target="_blank">添加了示例,显示的替代方案 ix。
首先,以下是这三种方法的概述:
loc
从索引获取带有特定标签的行(或列)。iloc
获取索引中特定位置的行(或列)(因此仅获取整数)。ix
通常试图表现得像,loc
但iloc
如果索引中不存在标签,则会回落为行为。ix
则将仅使用基于标签的索引,而不会使用基于位置的索引。如果标签不在索引中,则会引发错误。ix
将立即使用基于位置的索引,而不是基于标签的索引。但是,如果ix给定另一种类型(例如字符串),则可以使用基于标签的索引。为了说明这三种方法之间的差异,请考虑以下系列:
>>> s = pd.Series(np.nan, index=[49,48,47,46,45, 1, 2, 3, 4, 5])
>>> s
49 NaN
48 NaN
47 NaN
46 NaN
45 NaN
1 NaN
2 NaN
3 NaN
4 NaN
5 NaN
我们将看看用整数值切片3。
在这种情况下,向s.iloc[:3]我们返回前3行(因为它将3视为位置),并向s.loc[:3]我们返回前8行(由于将3视为标签):
>>> s.iloc[:3] # slice the first three rows
49 NaN
48 NaN
47 NaN
>>> s.loc[:3] # slice up to and including label 3
49 NaN
48 NaN
47 NaN
46 NaN
45 NaN
1 NaN
2 NaN
3 NaN
>>> s.ix[:3] # the integer is in the index so s.ix[:3] works like loc
49 NaN
48 NaN
47 NaN
46 NaN
45 NaN
1 NaN
2 NaN
3 NaN
注意s.ix[:3],s.loc[:3]
由于它首先查找标签,而不是在位置上工作(因此,其索引为s整数类型),因此Notification
返回相同的Series 。
如果我们尝试使用不在索引中的整数标签(例如6)怎么办?
此处s.iloc[:6]
按预期返回Series
的前6行。但是,s.loc[:6]
由于6不在索引中,所以引发KeyError 。
>>> s.iloc[:6]
49 NaN
48 NaN
47 NaN
46 NaN
45 NaN
1 NaN
>>> s.loc[:6]
KeyError: 6
>>> s.ix[:6]
KeyError: 6
按照上面提到的微妙之处,s.ix[:6]
现在引发了KeyError
,因为它试图像在索引中一样loc找到但不能找到一个6。因为我们的索引是整数类型,ix
所以不会回落为iloc
。
但是,如果索引是混合类型的,则给定的整数ix将iloc立即表现出来,而不是引发KeyError:
>>> s2 = pd.Series(np.nan, index=['a','b','c','d','e', 1, 2, 3, 4, 5])
>>> s2.index.is_mixed() # index is mix of different types
True
>>> s2.ix[:6] # now behaves like iloc given integer
a NaN
b NaN
c NaN
d NaN
e NaN
1 NaN
请记住,ix它仍然可以接受非整数并表现为loc:
>>> s2.ix[:'c'] # behaves like loc given non-integer
a NaN
b NaN
c NaN
作为一般建议,如果仅使用标签建立索引,或仅使用整数位置建立索引,请坚持使用loc或iloc避免出现意外结果-请勿使用ix。
结合基于位置和基于标签的索引
有时在给定DataFrame的情况下,你将需要为行和列混合使用标签和位置索引方法。
例如,考虑以下DataFrame。如何最好地将行切成“ c”
并包括前四列?
>>> df = pd.DataFrame(np.nan,
index=list('abcde'),
columns=['x','y','z', 8, 9])
>>> df
x y z 8 9
a NaN NaN NaN NaN NaN
b NaN NaN NaN NaN NaN
c NaN NaN NaN NaN NaN
d NaN NaN NaN NaN NaN
e NaN NaN NaN NaN NaN
在早期版本的pandas(0.20.0之前)中ix,你可以很整洁地进行此操作-我们可以按标签对行进行切片,按位置对列进行切片(请注意,对于列,ix由于4不是列名,因此默认为基于位置的切片 ):
>>> df.ix[:'c', :4]
x y z 8
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN
在更高版本的熊猫中,我们可以使用iloc并借助另一种方法来获得此结果:
>>> df.iloc[:df.index.get_loc('c') + 1, :4]
x y z 8
a NaN NaN NaN NaN
b NaN NaN NaN NaN
c NaN NaN NaN NaN
get_loc()
是一种索引方法,意思是“获取标签在此索引中的位置”。请注意,由于切片与iloc不包含其端点,因此如果我们还希望行'c'
,则必须在此值上加1。
此处的熊猫文档中还有其他示例。
有人能解释一下这两种切片方法有什么不同吗? 我看过文档,也看到过这些答案,但我还是发现自己无法理解这三种方法有什么不同。在我看来,它们在很大程度上是可以互换的,因为它们处于较低的切片级别。 例如,假设我们希望获得的前五行。这两个是怎么工作的? 谁能说出三种情况,在使用上的区别比较清楚? 从前,我也想知道这两个函数与有什么不同,但是已经从pandas 1.0中删除了,所以我不再关心了。
关于堆栈溢出,有多个问题比较loc、iloc和ix,比如这一个,还有多个问题讨论速度差异,比如这一个。似乎大家的共识是.ix速度更快,但它已被弃用。 这就引出了我的问题,如果. ix更快,尤其是在基于标签的索引中,为什么要弃用它?为什么你不想使用更快的方法?我发现弃用. ix的唯一原因是它混淆了人们,因为它对标签和整数都有效。我是不是漏了什么?或者. ix的唯一缺点是它令人困惑,因此将来可能不支持
问题内容: 最近开始从我的安全位置(R)分支到Python,并且对中的单元格定位/选择感到有些困惑。我已经阅读了文档,但仍在努力了解各种本地化/选择选项的实际含义。 我为什么应该使用或超过最一般的选择? 我的理解是,,,和可以提供一些保证正确性是不能提供的,但我也看到了在那里往往是一刀切最快的解决方案。 请说明使用除?以外的任何东西背后的现实世界中的最佳实践推理。 问题答案: loc: 仅适用于索
本文向大家介绍详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别),包括了详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)的使用技巧和注意事项,需要的朋友参考一下 在操作DataFrame时,肯定会经常用到loc,iloc,at等函数,各个函数看起来差不多,但是还是有很多区别的,我们一起来看下吧。 首先
参考这个答案,Lev说包括开始和停止索引,所以我尝试了这个: 但它们也不同。为什么啊? 有人能帮我吗?
假设我有下面的数据框,我想将