例如,
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
的内部运作一无所知。有谁知道为什么或如何发生这种情况?
更重要的是,访问标量的最有效方法是什么,以便保留其类型?
答案 0 :(得分:2)
这是因为pandas Series
只能使用一种类型,当您df1.ix[0,'y']
访问列y
的第一行时。行包含float
变量,因此所有内容都转换为np.float64
。当您致电df1['y'].ix[0]
时,您访问了y
列dtype
,该列np.int32
dtype
到第一个元素。一切都按预期工作。因此,对于关于最稳健方式的问题,我认为第二种方法更受欢迎,因为您始终知道列的row
,或者您可以轻松地检查它,而ix
则可以自动转换。
顺便说一下,如果你按位置访问元素(当你使用列时),最好使用iloc
。来自.ix
的{{1}}:
.ix
支持基于混合整数和标签的访问。它主要是 基于标签,但将回退到整数位置访问,除非 相应的轴是整数类型。.loc
是最普遍的 将支持.iloc
和.ix
中的任何输入。.ix
也支持 浮点标签计划。交易时.iloc
特别有用 使用基于位置和标签的混合分层索引。但是,当轴是基于整数的时,仅限基于标签的访问和 不支持位置访问。因此,在这种情况下,通常是这样 最好明确并使用
.loc
或[]
如果您只需要访问标量,则还应考虑使用docs方法。来自iat
:
由于使用
at
进行索引必须处理大量案例(单标签) 访问,切片,布尔索引等),它有一点开销 为了找出你所要求的东西。如果您只想访问 标量值,最快的方法是使用iat
和In [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