1

跟进上一个问题,是否有一种首选的有效方式来获取列中每个对象的类型?这特别适用于dtype列的object允许列元素之间的异构类型(特别是允许数字NaN而不将其他元素的数据类型更改为float)的情况。

我还没有进行时间基准测试,但我对以下立即想到的明显方式(以及可能使用mapor的变体filter)持怀疑态度。感兴趣的用例需要快速获取有关所有元素类型的信息,因此生成器等可能不会在这里提高效率。

# 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.

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

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

vtype(dfrm['A'])

这两个想法都导致了可行的输出,但我担心的是效率。

添加

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

apply()方法显然获胜,所以有充分的理由期望我不会比 with 更有效率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
4

1 回答 1

3

Series.applySeries.map使用pandas.lib.map_infer我编写的专门的 Cython 方法()比使用numpy.vectorize.

于 2012-07-19T14:55:45.917 回答