首页 > 解决方案 > 如何快速将熊猫数据框拆分为元组列?

问题描述

我有一个 pd.Series 字符串元素,由 分隔'_',其中只有两个元素。

例如,

s = pd.Series([a_1, a_2, a_3, b_1])

该命令s.str.split("_")将返回一系列列表

0   ['a', '1']
1   ['a', '2']
2   ['a', '3']
3   ['b', '1']

该命令s.str.partition("_", expand=False)将返回一系列元组,其中_将是元组中的第二个元素

0   ('a', '_', '1')
1   ('a', '_', '2')
2   ('a', '_', '3')
3   ('b', '_', '1')

是否有一种干净(且快速)的方法来创建一系列元组,而无需_其中:

0   ('a', '1')
1   ('a', '2')
2   ('a', '3')
3   ('b', '1')

我总是可以做到:s.str.split("_").apply(tuple),但 apply 总是比内置函数慢(比如str.split...)

标签: pythonpandas

解决方案


一个想法是使用列表理解:

s = pd.Series('a_1, a_2, a_3, b_1'.split(', '))
#4k rows
s = pd.concat([s] * 1000, ignore_index=True)

In [195]: %timeit s.str.split("_").apply(tuple)
2.49 ms ± 41.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [196]: %timeit [tuple(x.split('_')) for x in s]
1.46 ms ± 79.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [197]: %timeit pd.Index(s).str.split("_", expand=True).tolist()
4.31 ms ± 14.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

s = pd.Series('a_1, a_2, a_3, b_1'.split(', '))
#400k rows
s = pd.concat([s] * 100000, ignore_index=True)

In [199]: %timeit s.str.split("_").apply(tuple)
252 ms ± 4.63 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [200]: %timeit [tuple(x.split('_')) for x in s]
180 ms ± 370 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [201]: %timeit pd.Index(s).str.split("_", expand=True).tolist()
379 ms ± 1.73 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

推荐阅读