我一直在探索如何优化我的代码,并运行了pandas
.at
方法。根据文件
基于标签的快速标量访问器
与loc类似,at提供基于标签的标量查找。您也可以使用这些索引器进行设置。
所以我做了一些样本:
设置
import pandas as pd
import numpy as np
from string import letters, lowercase, uppercase
lt = list(letters)
lc = list(lowercase)
uc = list(uppercase)
def gdf(rows, cols, seed=None):
"""rows and cols are what you'd pass
to pd.MultiIndex.from_product()"""
gmi = pd.MultiIndex.from_product
df = pd.DataFrame(index=gmi(rows), columns=gmi(cols))
np.random.seed(seed)
df.iloc[:, :] = np.random.rand(*df.shape)
return df
seed = [3, 1415]
df = gdf([lc, uc], [lc, uc], seed)
print df.head().T.head().T
字符串df
看起来像:
a
A B C D E
a A 0.444939 0.407554 0.460148 0.465239 0.462691
B 0.032746 0.485650 0.503892 0.351520 0.061569
C 0.777350 0.047677 0.250667 0.602878 0.570528
D 0.927783 0.653868 0.381103 0.959544 0.033253
E 0.191985 0.304597 0.195106 0.370921 0.631576
型
让我们使用.at
和.loc
,并确保得到相同的结果
print "using .loc", df.loc[('a', 'A'), ('c', 'C')]
print "using .at ", df.at[('a', 'A'), ('c', 'C')]
using .loc 0.37374090276
using .at 0.37374090276
型
使用.loc
测试速度
%%timeit
df.loc[('a', 'A'), ('c', 'C')]
10000 loops, best of 3: 180 µs per loop
型
使用.at
测试速度
%%timeit
df.at[('a', 'A'), ('c', 'C')]
The slowest run took 6.11 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 8 µs per loop
型
这似乎是一个巨大的速度增长。即使在缓存阶段,6.11 * 8
也比180
快得多
提问
.at
有哪些限制?我有动力去使用它。文档说它类似于.loc
,但它的行为并不相似。范例:
# small df
sdf = gdf([lc[:2]], [uc[:2]], seed)
print sdf.loc[:, :]
A B
a 0.444939 0.407554
b 0.460148 0.465239
型
其中print sdf.at[:, :]
导致TypeError: unhashable type
所以显然不一样,即使意图相似。
也就是说,谁能提供关于.at
方法能做什么和不能做什么的指导?
5条答案
按热度按时间h22fl7wq1#
更新:
df.get_value
从0.21.0版本起已弃用。使用df.at
或df.iat
是推荐的方法。df.at
一次只能访问一个值。df.loc
可以选择多个行和/或列。请注意,还有
df.get_value
,它在访问单个值时可能更快:字符串
在底层,
df.at[...]
调用df.get_value
,但它也对键进行一些类型检查。5fjcxozz2#
当你问到
.at
的局限性时,我最近遇到了一件事(使用pandas 0.22)。让我们使用the documentation的例子:字符串
如果我现在知道了
型
结果看起来和预期一样
型
然而,当我尝试做
型
似乎
.at
试图保存数据类型(这里:int
):型
这似乎是
.loc
的区别:型
产生所需的
型
上面例子中的风险在于它悄无声息地发生(从
float
到int
的转换)。当你尝试使用字符串时,它会抛出一个错误:型
ValueError:invalid literal for int()with base 10:'a_string'
但是,如果使用一个字符串
int()
实际上起作用,如注解中的@n1k31t4所述,它将工作。型
rqmkfv5c3#
在上面的基础上,
at
函数的Pandas documentation声明:访问行/列标签对的单个值。
与loc类似,都提供基于标签的查找。如果只需要获取或设置DataFrame或Series中的单个值,请使用at。
对于设定数据
loc
和at
是相似的,例如:字符串
loc
和at
将产生相同的结果型
此外,对于访问单个值,两者是相同的
型
但是,当匹配多个值时,
loc
将从DataFrame返回一组行/列,而at
将返回一个值数组型
更重要的是,
loc
可以用于匹配一组行/列,并且只能给出一个索引,而at
必须接收列型
bwntbbo34#
与
.loc
相比,.at
是一种优化的数据访问方法。Dataframe 的
.loc
选择由其参数中给定的indexed_rows和labeled_columns定位的所有元素。相反,.at
选择位于给定indexed_row和labeled_column的 Dataframe 的特定元素。此外,
.at
接受一行和一列作为输入参数,而.loc
可以接受多行和多列。使用.at
的输出是单个元素,使用.loc
的输出可能是Series或DataFrame。c9qzyr3d5#
.at
的另一个限制是.loc
接受其他输入(以换取索引),例如条件,而.at
不接受:字符串