python - 用于访问 Pandas 中的列的括号表示法和点表示法之间的速度差异

标签 python pandas performance

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

当我搜索成员资格时,速度会因我要求在 df.CIDdf['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

这是为什么?

最佳答案

df['CID'] 委托(delegate)给 NDFrame.__getitem__并且更明显的是您正在执行索引操作。

另一方面,df.CID 委托(delegate)给 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 没有问题,因为它不与 pandas 中的任何属性或函数命名冲突。但是,请考虑 pop功能(仅作为示例)。

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

df.popdf 的绑定(bind)方法。现在,出于各种原因,我想创建一个名为“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

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

关于python - 用于访问 Pandas 中的列的括号表示法和点表示法之间的速度差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56240925/

相关文章:

python-3.x - 为什么np.std()和pivot_table(aggfunc=np.std)返回不同的结果

Python 和 OpenCV : Second largest object

python - 如何使用 Python 将 scipy.signal.spectrogram 反转为音频?

python - 替换符合条件的所有单元格的内容

python - 如果任何列值不遵守 pandas 中的条件,则删除行

Mysql 和网络延迟

java - Dsun.java2d.trace 是如何工作的

asp.net - 性能 : asp. 网络缓存与单例

python - 单击时从 Django 模板调用对象的方法

python - 有没有办法在 numpy 中创建列向量而不必创建列表列表?