pd.Series.str.contains的矢量化版本

2024-09-29 23:17:58 发布

您现在位置:Python中文网/ 问答频道 /正文

给定两个索引相同的pd.系列字符串,检查第一个pd.系列的每个元素是否是第二个pd.系列对应元素的子字符串的最有效方法是什么

例如:

s1 = pd.Series(['cat', 'dog', 'ham'])
s2 = pd.Series(['catbird', 'frog', 'hamster'])  

pd.Series([t[0] in t[1] for t in zip(s1, s2)], index=s1.index)

屈服

0     True
1    False
2     True
dtype: bool

Tags: 方法字符串intrue元素indexcatseries
2条回答

我认为您的解决方案是好的,因为pandas.str函数也使用循环(并处理缺少的值),所以有时会比较慢

我对解决方案进行了一些小的修改-将元组解包为变量tv,在测试数据中,解包速度更快一些:

np.random.seed(2020)

N = 10000
s1 = pd.Series(np.random.choice(list(string.ascii_letters), size=N))
s2 = pd.DataFrame(np.random.choice(list(string.ascii_letters), size=(N, 3))).sum(axis=1)

In [82]: %timeit (pd.Series([t[0] in t[1] for t in zip(s1, s2)], index=s1.index))
3.47 ms ± 271 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [83]: %timeit (pd.Series([t in v for t, v in zip(s1, s2)], index=s1.index))
2.89 ms ± 130 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

此外:

import numpy as np
import pandas as pd
import string

np.random.seed(2020)

N = 10000
s1 = pd.Series(np.random.choice(list(string.ascii_letters), size=N))
s2 = pd.DataFrame(np.random.choice(list(string.ascii_letters), size=(N, 3))).sum(axis=1)

%%timeit
s1.apply(lambda x: x[0] in s2.loc[x.name, 0], axis=1)

218 ms ± 8.61 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

也许不是最好的方法:)

相关问题 更多 >

    热门问题