今天我开始在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。
答案 0 :(得分:0)
时间和内存消耗都是错误的。你的问题是错误的:它不仅仅是lambda
,而是关于apply
和lambda
。
使用分析显示此方法的效率低于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的一些阅读,你可能会感兴趣。