python中的ix是啥_Python-iloc,ix和loc有何不同?

小编典典

注意:在熊猫版本0.20.0及更高版本中,ix已弃用,建议改为使用loc和iloc。我留下了ix完整的答案部分,以供早期版本的熊猫用户参考。下面添加了示例,显示的替代方案 ix。

首先,以下是这三种方法的概述:

loc从索引获取带有特定标签的行(或列)。

iloc获取索引中特定位置的行(或列)(因此仅获取整数)。

ix通常试图表现得像,loc但iloc如果索引中不存在标签,则会回落为行为。

重要的是要注意一些细微之处,这些细微之处可能会使ix使用起来有些棘手:

如果索引是整数类型,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。

此处的熊猫文档中还有其他示例。

2020-02-10

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值