pandas df.ix [number,column]访问与df [column] .ix [number]不同的标量类型

时间:2016-01-12 23:53:18

标签: python pandas

例如,

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'frames':np.arange(3), 'r':np.repeat(3, 3), \
'x':np.random.rand(3), 'y':list('041')}, index=list('abc'))

  frames  r       x   y
a      0  3  0.1241  '0'
b      1  3  0.4109  '4'
c      2  3  0.8714  '1'

然后type(df1.ix[0, 'y']), type(df1['y'].ix[0])按预期返回(str, str)

然而,在将'y'列dtype更改为带df1['y'] = df1['y'].astype(int)的整数:

之后

现在,type(df1.ix[0, 'y']), type(df1['y'].ix[0])返回(numpy.float64, numpy.int64)

这对我来说似乎是非常不一致的行为。这两种方法不应该返回相同的标量类型吗?我意识到我对ix的内部运作一无所知。有谁知道为什么或如何发生这种情况?

更重要的是,访问标量的最有效方法是什么,以便保留其类型?

1 个答案:

答案 0 :(得分:2)

这是因为pandas Series只能使用一种类型,当您df1.ix[0,'y']访问列y的第一行时。行包含float变量,因此所有内容都转换为np.float64。当您致电df1['y'].ix[0]时,您访问了ydtype,该列np.int32 dtype到第一个元素。一切都按预期工作。因此,对于关于最稳健方式的问题,我认为第二种方法更受欢迎,因为您始终知道列的row,或者您可以轻松地检查它,而ix则可以自动转换。

顺便说一下,如果你按位置访问元素(当你使用列时),最好使用iloc。来自.ix的{​​{1}}:

  

.ix支持基于混合整数和标签的访问。它主要是   基于标签,但将回退到整数位置访问,除非   相应的轴是整数类型。 .loc是最普遍的   将支持.iloc.ix中的任何输入。 .ix也支持   浮点标签计划。交易时.iloc特别有用   使用基于位置和标签的混合分层索引。

     

但是,当轴是基于整数的时,仅限基于标签的访问和   不支持位置访问。因此,在这种情况下,通常是这样   最好明确并使用.loc[]

如果您只需要访问标量,则还应考虑使用docs方法。来自iat

  

由于使用at进行索引必须处理大量案例(单标签)   访问,切片,布尔索引等),它有一点开销   为了找出你所要求的东西。如果您只想访问   标量值,最快的方法是使用iatIn [129]: %timeit df1.y.ix[0] 10000 loops, best of 3: 30.2 us per loop In [130]: %timeit df1.y.iloc[0] 10000 loops, best of 3: 24.6 us per loop In [131]: %timeit df1.y.iat[0] 100000 loops, best of 3: 18.8 us per loop 方法,   它们在所有数据结构上实现。

<强>基准:

Build Settings