【问题标题】:pandas apply convert to int differences between np.int, lambda and astype()pandas 应用转换为 np.int、lambda 和 astype() 之间的 int 差异
【发布时间】:2018-10-21 11:20:19
【问题描述】:

给定一个df

df = pd.DataFrame(['0', '1', '2', '3'], columns=['a'])

使用有什么区别

 df['b'] = df['a'].apply(np.int)

,

df['b'] = df['a'].apply(lambda x : int(x))

df['b'] = df['a'].astype(int)

我知道所有都会给出相同的结果,但有什么不同吗?

【问题讨论】:

标签: python pandas


【解决方案1】:

np.int 是 int 的别名。

你可以通过运行来测试:

import numpy as np
print(int == np.int)

这将返回 True。

另外:考虑查看this question,它对您的问题有非常透彻的解释。

【讨论】:

    【解决方案2】:

    下面使用 pandas 的 apply 函数来迭代使用 numpy 的 int 演员表,这与 python 的 int 演员表相同。所以,这两者都是一样的。

    df['b'] = df['a'].apply(np.int)
    df['b'] = df['a'].apply(lambda x : int(x))
    

    然而,astype 函数将一个系列转换为指定的 dtype,这里 int 对于 pandas 是 int64

    df['b'] = df['a'].astype(int)
    

    astype 是一个矢量化函数,我更喜欢使用它而不是 apply 方法,因为与 astype相比,它的时间复杂度很差>.

    【讨论】:

      【解决方案3】:

      当您使用 apply 时,它通过循环数据并将每个值的 dtype 更改为整数来工作。因此,与astype 相比,它们的速度较慢

      df = pd.DataFrame(pd.np.arange(10**7).reshape(10**4, 10**3)).astype(str)
      
      # Performance
      %timeit df[0].apply(np.int)
      7.15 ms ± 319 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
      
      %timeit df[0].apply(lambda x : int(x))
      9.57 ms ± 405 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
      

      两者在性能方面几乎相似。

      这里是astype,它的功能经过优化,比应用更快。

      %timeit df[0].astype(int)
      1.94 ms ± 96.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
      

      如果您正在寻找一种更快的方法,那么我们应该选择 numpy 数组可以提供的矢量化方法。

      %timeit df[0].values.astype(np.int)
      1.26 ms ± 19.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
      

      如您所见,时差很大。

      【讨论】:

        猜你喜欢
        • 2021-06-03
        • 2014-03-18
        • 1970-01-01
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-20
        相关资源
        最近更新 更多