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
有一个向量化的方法来更快地执行这个操作。
5条答案
按热度按时间8oomwypt1#
值上带有
itertools.chain()
这样可以更快:
字符串
性能
型
对于这个数据集,
chain
ing大约快68倍。矢量化?
矢量化在具有原生NumPy数据类型时有效(pandas毕竟使用NumPy作为数据)。由于我们已经在系列中有列表,并且希望得到一个列表,矢量化不太可能提高速度。标准Python对象和pandas/NumPy数据类型可能会消耗掉你从矢量化中获得的所有性能。我在另一个答案中尝试了矢量化算法。
pxq42qpu2#
矢量化但速度慢
你可以使用NumPy的
concatenate
:字符串
性能
但是我们已经有了列表,即Python对象。所以向量化必须在Python对象和NumPy数据类型之间来回切换。这使得事情变慢:
型
bt1cpqcv3#
你可以用
business["categories"].str.join('')
试试运气,但我猜Pandas使用Python的字符串函数。我怀疑你能比Python提供的更好。y1aodyip4#
我用
"".join(business["categories"])
它比
business["categories"].str.join('')
快得多,但仍然比itertools.chain
方法慢4倍。我更喜欢它,因为它更具可读性,不需要导入。x7yiwoj45#
如果有“无”值,则可以先过滤它们
字符串