跟进a previous question,是否有一种首选的有效方法来获取列中每个对象的类型?这特别适用于列的dtype为object的情况,以允许该列的元素之间使用异构类型(特别是允许数字NaN而不将其他元素的数据类型更改为)。我尚未进行时间基准测试,但是我对以下想到的立即显而易见的方式(以及可能使用float或map的变体)表示怀疑。感兴趣的用例需要快速获取所有元素类型的信息,因此,生成器之类的东西可能不会在这里带来效率。# 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 filter函数,但这真的会更有效吗?例如,使用与上述相同的设置,我可以尝试:import numpy as npvtype = np.vectorize(lambda x: type(x)) # Gives error without lambdavtype(dfrm['A'])两种想法都能产生可行的输出,但这是我担心的效率。添加我继续并在IPython中做了一个很小的基准测试。首先是上面的vectorize,然后是vtype路线。我重复了十几次,这个例子在我的机器上非常典型。apply方法显然是成功的,所以有充分的理由期望我不会比apply()更有效率吗?对于apply()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.03515315055851000: 0.00032401084899910000: 0.00209212303162100000: 0.02240514755251000000: 0.21113610267610000000: 2.2215731144对于vtype()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.0009009838104251000: 0.00015902519226110000: 0.00117015838623100000: 0.01110506057741000000: 0.10356307029710000000: 1.03093600273 最佳答案 Series.apply和Series.map使用一种专门的Cython方法(pandas.lib.map_infer),它比使用numpy.vectorize快大约2倍。关于python - 在Python/Pandas中获取元素类型的有效方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11553370/
10-12 15:06