系列的“减少”功能

新手上路,请多包涵

熊猫系列是否有 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)

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

原文由 hlin117 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 427
2 个回答

在值上加上 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

对于这个数据集 chain ing 大约快 68 倍。

矢量化?

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

原文由 Mike Müller 发布,翻译遵循 CC BY-SA 3.0 许可协议

矢量化但速度慢

您可以使用 NumPy 的 concatenate

 import numpy as np

list(np.concatenate(categories.values))

表现

但是我们已经有了列表,即 Python 对象。因此矢量化必须在 Python 对象和 NumPy 数据类型之间来回切换。这让事情变慢:

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

%timeit list(np.concatenate(categories.values))
100 loops, best of 3: 7.66 ms per loop

%timeit np.concatenate(categories.values)
100 loops, best of 3: 5.33 ms per loop

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

原文由 Mike Müller 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题