对系列中的多个子字符串进行高效 Pandas 过滤
确定一个系列是否包含多个子字符串中的任何一个是数据分析中的常见任务。虽然使用逻辑或组合单个 str.contains 操作提供了一种简单的解决方案,但对于长子字符串列表和大型数据帧来说,它可能效率低下。
要优化此任务,请考虑采用正则表达式 (regex) 方法。通过将子字符串包装在正则表达式模式中,我们可以利用 pandas 的高效字符串匹配功能。具体来说,在转义子字符串中的任何特殊字符后,我们可以通过使用管道字符 (|) 连接子字符串来构造正则表达式模式:
import re esc_lst = [re.escape(s) for s in lst] pattern = '|'.join(esc_lst)
使用此模式,我们可以使用 str 过滤序列。包含且不区分大小写的匹配:
df[col].str.contains(pattern, case=False)
这种方法提供了改进的性能,特别是对于大型数据帧。考虑以下示例:
from random import randint, seed seed(321) # 100 substrings of 5 characters lst = [''.join([chr(randint(0, 256)) for _ in range(5)]) for _ in range(100)] # 50000 strings of 20 characters strings = [''.join([chr(randint(0, 256)) for _ in range(20)]) for _ in range(50000)] col = pd.Series(strings) esc_lst = [re.escape(s) for s in lst] pattern = '|'.join(esc_lst)
使用这种优化方法,对于 50,000 行和 100 个子字符串的过滤操作大约需要 1 秒,比原始问题中描述的方法要快得多。对于较大的数据帧和子字符串列表,性能差异变得更加明显。
以上是如何有效过滤 Pandas 系列的多个子字符串?的详细内容。更多信息请关注PHP中文网其他相关文章!