我有一个数据框,大约有10万行。数据框中的“sequence”列有一些长字符串作为其值。我想要计算“sequence”列中重叠子字符串的出现次数(即如果值为aaaaaa,子字符串为aa,则频率应为5,而不是3)。
以下是类似于实际代码的可重复代码。
请注意,Pandas内置函数“pd.Series.str.count”将计算子字符串出现的次数而不重叠,因此我必须将其与正则表达式一起使用。
问题在于,在我的计算机上,每个子字符串的频率计算需要大约0.5秒的时间,由于有11^3到11^5个子字符串,最坏情况下可能需要多达80,000秒(或11小时)。
似乎lambda操作会减慢计算时间,因为它必须在Python中编译,而不是Cython(无疑比Python快),但我不知道还有什么其他方法可以做到这一点。
我想知道是否有加速此操作的方法?
附言:我正在使用Python 3.5.2
以下是类似于实际代码的可重复代码。
import pandas as pd
import re
import itertools
import time
from random import choice
# generate 100,000 random strings of fixed size for demo purpose
alphabet = "abcdefghijk"
str_list = []
for i in range(100000):
str_list.append(''.join(choice(alphabet) for i in range(100)))
# make pandas dataframe
df = pd.DataFrame(columns=['sequence'], data=str_list)
# get a list of substrings to count its frequency in the dataframe
# for the sake of demo, make substrings from "alphabet" with length of 3
# actual application can have up to substrings of length 5 (i.e. 11^5 substrings)
words = [''.join(p) for p in itertools.product(alphabet, repeat=3))]
# calculate frequency of words in the dataframe
for word in words:
tic = time.time()
df['frequency'] = df['sequence'].apply(lambda x: len(re.findall('(?={0})'.format(word), x)))
print("{}s took for one iteration".format(time.time() - tic))
请注意,Pandas内置函数“pd.Series.str.count”将计算子字符串出现的次数而不重叠,因此我必须将其与正则表达式一起使用。
问题在于,在我的计算机上,每个子字符串的频率计算需要大约0.5秒的时间,由于有11^3到11^5个子字符串,最坏情况下可能需要多达80,000秒(或11小时)。
似乎lambda操作会减慢计算时间,因为它必须在Python中编译,而不是Cython(无疑比Python快),但我不知道还有什么其他方法可以做到这一点。
我想知道是否有加速此操作的方法?
附言:我正在使用Python 3.5.2