首页 > 解决方案 > 为什么 Series.apply 在带有间隔的列上如此之快?

问题描述

我一直认为Series.apply是行上的循环,我们知道 DataFrame.apply(axis=1) 有一些可怕的缩放https://stackoverflow.com/a/55557758/4333359

但是,当尝试pandas._libs.interval.Interval使用 dtype获得 Series of 的中点时,category我注意到这Series.apply似乎根本没有这样做,并且速度与类似Series.map

在下面的示例中,我尝试通过应用 lambda(应该很慢?)或做一些我认为应该非常快的事情(将 3 个间隔映射到它们的中点,仅循环 3 个唯一间隔)来获取间隔的中点.

那么发生了什么事,为什么Series.apply这么快,或者map只是非常慢?

import perfplot
import pandas as pd
import numpy as np

def apply_mid(s):
    return s.apply(lambda x: x.mid)

def map_mid(s):
    d = {x: x.mid for x in s.cat.categories}
    return s.map(d)

perfplot.show(
    setup=lambda n: pd.cut(pd.Series(np.random.randint(1, 100, 3*n)), 3), 
    kernels=[
        lambda s: apply_mid(s),
        lambda s: map_mid(s),
    ],
    labels=['apply', 'map'],
    n_range=[2 ** k for k in range(24)],
    equality_check=np.allclose,  
    xlabel='~len(df)'
)

在此处输入图像描述

标签: pythonpandas

解决方案


推荐阅读