>-6ren">
gpt4 book ai didi

python - "Reduce"系列功能

转载 作者:IT老高 更新时间:2023-10-28 20:47:48 26 4
gpt4 key购买 nike

Pandas 系列有 reduce 的类比吗?

例如,map 的类比是 pd.Series.apply ,但我找不到 reduce 的任何模拟。


我的应用是,我有一个 pandas 系列的列表:

>>> business["categories"].head()

0 ['Doctors', 'Health & Medical']
1 ['Nightlife']
2 ['Active Life', 'Mini Golf', 'Golf']
3 ['Shopping', 'Home Services', 'Internet Servic...
4 ['Bars', 'American (New)', 'Nightlife', 'Loung...
Name: categories, dtype: object

我想使用 reduce 将一系列列表合并在一起,如下所示:

categories = reduce(lambda l1, l2: l1 + l2, categories)

但这需要一个可怕的时间,因为在 Python 中将两个列表合并在一起是 O(n) 时间。我希望 pd.Series 有一种矢量化的方式来更快地执行此操作。

最佳答案

在值上使用 itertools.chain()

这可能会更快:

from itertools import chain
categories = list(chain.from_iterable(categories.values))

性能

from functools import reduce
from itertools import chain

categories = pd.Series([['a', 'b'], ['c', 'd', 'e']] * 1000)

%timeit list(chain.from_iterable(categories.values))
1000 loops, best of 3: 231 µs per loop

%timeit list(chain(*categories.values.flat))
1000 loops, best of 3: 237 µs per loop

%timeit reduce(lambda l1, l2: l1 + l2, categories)
100 loops, best of 3: 15.8 ms per loop

对于这个数据集,chaining 大约快 68 倍。

矢量化?

当您拥有原生 NumPy 数据类型时,向量化就可以工作(毕竟 pandas 使用 NumPy 作为其数据)。由于我们已经在 Series 中有列表并且想要一个列表作为结果,因此矢量化不太可能加快速度。标准 Python 对象和 pandas/NumPy 数据类型之间的转换可能会耗尽您从矢量化中获得的所有性能。我尝试在另一个答案中对算法进行矢量化。

关于python - "Reduce"系列功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35004945/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com