python - 在 Python/Pandas 中获取元素类型的有效方法

标签 python performance types pandas

跟进a previous question ,是否有一种首选的有效方式来获取列中每个对象的类型?这是专门针对列的 dtypeobject 的情况,以允许列的元素之间存在异构类型(特别是允许数字 NaN 而不将其他元素的数据类型更改为float)。

我还没有做过时间基准测试,但我对下面想到的显而易见的方法(以及可能使用 mapfilter 的变体)持怀疑态度。感兴趣的用例需要快速获取所有元素类型的信息,因此生成器等可能不会提高效率。

# df is a pandas DataFrame with some column 'A', such that
# df['A'].dtype is 'object'

dfrm['A'].apply(type) #Or np.dtype, but this will fail for native types.

另一个想法是使用 NumPy vectorize 函数,但这真的会更高效吗?例如,使用与上面相同的设置,我可以尝试:

import numpy as np
vtype = np.vectorize(lambda x: type(x)) # Gives error without lambda

vtype(dfrm['A'])

这两种想法都会产生可行的输出,但我担心的是效率。

已添加

我继续在 IPython 中做了一个小型基准测试。首先是上面的 vtype,然后是 apply 路由。我重复了十几次左右,这个示例在我的机器上运行非常典型。

apply() 方法显然胜出,所以有充分的理由认为我不会比 apply() 更高效吗?

对于vtype()

In [49]: for ii in [100,1000,10000,100000,1000000,10000000]:
   ....:     dfrm = pandas.DataFrame({'A':np.random.rand(ii)})
   ....:     dfrm['A'] = dfrm['A'].astype(object)
   ....:     dfrm['A'][0:-1:2] = None
   ....:     st_time = time.time()
   ....:     tmp = vtype(dfrm['A'])
   ....:     ed_time = time.time()
   ....:     print "%s:\t\t %s"%(ii, ed_time-st_time)
   ....:     
100:         0.0351531505585
1000:        0.000324010848999
10000:       0.00209212303162
100000:      0.0224051475525
1000000:     0.211136102676
10000000:    2.2215731144

对于apply()

In [50]: for ii in [100,1000,10000,100000,1000000,10000000]:
   ....:     dfrm = pandas.DataFrame({'A':np.random.rand(ii)})
   ....:     dfrm['A'] = dfrm['A'].astype(object)
   ....:     dfrm['A'][0:-1:2] = None
   ....:     st_time = time.time()
   ....:     tmp = dfrm['A'].apply(type)
   ....:     ed_time = time.time()
   ....:     print "%s:\t %s"%(ii, ed_time-st_time)
   ....:     
100:         0.000900983810425
1000:        0.000159025192261
10000:       0.00117015838623
100000:      0.0111050605774
1000000:     0.103563070297
10000000:    1.03093600273

最佳答案

Series.applySeries.map 使用我编写的专用 Cython 方法 (pandas.lib.map_infer),速度大约快 2 倍与使用 numpy.vectorize 相比。

关于python - 在 Python/Pandas 中获取元素类型的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11553370/

相关文章:

mysql - 在大型 MySQL InnoDB 表上,完整计数查询真的这么慢吗?

mysql - 低基数列索引 VS 表开销

Python3.5 多处理与 Pandas : Process never stop

python - 如何查找列表中最常见的元素(使用 all())

python - 如何在车道检测算法中自动检测道路边界?

javascript - 向原生 JavaScript 对象添加方法对性能有何影响?

java - Android 类型为 "..."

c# - 有没有可以将所有声明转换为完全限定类型的 C# 重构工具?

types - 在 Rust 中构建异构类型列表

python - 使用 BeautifulSoup 在 html 中查找所有表格