Lambdas是在python中对数据帧执行转换的最有效方法吗?

时间:2017-09-19 20:53:10

标签: python lambda jupyter-notebook

今天我开始在python中使用大型数据框,并尝试用自身的标量倍数替换列。

例如:

df['some_column'] = [1,2,3,4,5] * 10 = [2,4,6,8,10]

我尝试了两种不同的方法来实现这一目标:

第一种方式:

df['some_column'] = df['some_column']*10

第二种方式:

df['some_column'] = df['some_column'].apply(lambda x: x*10)

我使用了timeit函数,发现它们都有类似的运行时。第一种方式,当我包含整个数据集时,Jupyter Notebook内核崩溃了,所以我认为它内存不足。第二种方式按预期工作,所以我猜测其内存密集程度较低。

问题:我是否正确假设lambda函数使用更少的内存?如果是这样,最好尽可能频繁地使用Lambdas吗?是否有任何类似的方式可能比我在此列出的两个方面的资源更少?

谢谢!

编辑:我在不同的环境中尝试过此操作并且没有崩溃,因此我之前对内存的假设不正确。在我正在使用的集合中,'some_column'的数据类型是int64。两种方式的运行时间分别为35ms和56ms。

1 个答案:

答案 0 :(得分:0)

时间和内存消耗都是错误的。你的问题是错误的:它不仅仅是lambda,而是关于applylambda

使用分析显示此方法的效率低于pandas中实现的并行函数的效率。

apply和Lambdas较慢

In [1]: import pandas as pd

In [2]: s = pd.Series(range(10000000))

In [3]: %timeit s * 10
100 loops, best of 3: 13.7 ms per loop

In [4]: %timeit s.multiply(10)                     # Using the function itself gives
100 loops, best of 3: 13.8 ms per loop             # same thing as above

In [5]: %timeit s.apply(lambda x: x * 10)
1 loop, best of 3: 2.92 s per loop                 # Factor 200 for timing

apply和Lambdas使用更多内存

In [1]: %load_ext memory_profiler

In [2]: import pandas as pd

In [3]: s = pd.Series(range(10000000))

In [4]: %memit s * 10
peak memory: 163.02 MiB, increment: 38.15 MiB

In [5]: %memit s.multiply(10)                      # Using the function itself gives
peak memory: 163.01 MiB, increment: 37.96 MiB      # same thing as above

In [6]: %memit s.apply(lambda x: x * 10)
peak memory: 1202.03 MiB, increment: 1077.40 MiB   # Factor 7 for memory

Lambdas和apply在某些情况下很有用,但不应过度使用。

您可以尝试对您的运营进行一些分析吗?也许使用数据框的子集来避免崩溃。我很惊讶这是multiply而不是apply发生的内存问题。

奖金:关于pandas performance的一些阅读,你可能会感兴趣。