括号表示法和点表示法之间的速度差异,用于访问熊猫中的列

时间:2019-05-21 14:48:56

标签: python pandas performance

我们有一个小的数据框:df = pd.DataFrame({'CID': [1,2,3,4,12345, 6]})

当我搜索成员资格时,根据我要搜索df.CID还是df['CID']的速度差异很大。

In[25]:%timeit 12345 in df.CID
Out[25]:89.8 µs ± 254 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In[26]:%timeit 12345 in df['CID']
Out[26]:42.3 µs ± 334 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In[27]:type( df.CID)
Out[27]: pandas.core.series.Series

In[28]:type( df['CID'])
Out[28]: pandas.core.series.Series

那是为什么?

1 个答案:

答案 0 :(得分:6)

df['CID']委托给NDFrame.__getitem__,显然您正在执行索引操作。

另一方面,df.CID委托给NDFrame.__getattr__,这需要做一些额外的繁重工作,主要是确定'CID'是您要使用的属性,函数还是列使用属性访问进行调用(一种方便,但不建议用于生产代码)。


现在,为什么不建议这样做?考虑,

df = pd.DataFrame({'A': [1, 2, 3]})
df.A

0    1
1    2
2    3
Name: A, dtype: int64

将“ A”列称为df.A是没有问题的,因为它与熊猫中的任何属性或函数命名都没有冲突。但是,请考虑pop函数(仅作为示例)。

df.pop
# <bound method NDFrame.pop of ...>

df.popdf的绑定方法。现在,出于各种原因,我想创建一个名为“ pop”的列。

df['pop'] = [4, 5, 6]
df
   A  pop
0  1    4
1  2    5
2  3    6

很好,但是

df.pop
# <bound method NDFrame.pop of ...>

我无法使用属性符号来访问此列。但是...

df['pop']

0    4
1    5
2    6
Name: pop, dtype: int64

括号符号仍然有效。这就是为什么这样更好。