python - 如何快速将熊猫数据框拆分为元组列?
问题描述
我有一个 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
...)
解决方案
一个想法是使用列表理解:
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)
推荐阅读
- python - 我们如何从 ocr 文本数据中为深度学习模型准备数据集?
- c# - 如何在使用 Prism 的 MVVM 应用程序中每次选择 TabItem 时运行方法
- php - 当 Web 服务器的 mysql 数据库发生变化时,我想发送推送通知。可能吗?
- ruby - Ruby 如何解决 'diamond' mixin 中的方法查找问题?
- asp.net - RadioButtonList 1 行彩色
- javascript - onclick="$('#id').toggle()" 不起作用,需要为 Chrome 旧版本重写
- java - 是否存在在没有 GC 的情况下使用的堆内存减少的情况,即没有 GC 事件的情况?
- php - 何时使用 MailChimp 单一或批量操作?
- java - 构造函数中带有@Value的FactoryBean?
- java - How to save path drawn on canvas as png