doz*_*tin 6 python performance pandas
让我们有一个小的数据框: df = pd.DataFrame({'CID': [1,2,3,4,12345, 6]})
当我搜索会员资格时,根据我要搜索in df.CID
还是in 的速度差异很大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
Run Code Online (Sandbox Code Playgroud)
这是为什么?
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
Run Code Online (Sandbox Code Playgroud)
将“ A”列称为df.A
,没有任何问题,因为它与熊猫中的任何属性或函数命名都不冲突。但是,请考虑该pop
功能(仅作为示例)。
df.pop
# <bound method NDFrame.pop of ...>
Run Code Online (Sandbox Code Playgroud)
df.pop
是的绑定方法df
。现在,出于各种原因,我想创建一个名为“ pop”的列。
df['pop'] = [4, 5, 6]
df
A pop
0 1 4
1 2 5
2 3 6
Run Code Online (Sandbox Code Playgroud)
很好,但是
df.pop
# <bound method NDFrame.pop of ...>
Run Code Online (Sandbox Code Playgroud)
我无法使用属性符号来访问此列。然而...
df['pop']
0 4
1 5
2 6
Name: pop, dtype: int64
Run Code Online (Sandbox Code Playgroud)
方括号表示法仍然有效。这就是为什么这样更好。
归档时间: |
|
查看次数: |
186 次 |
最近记录: |