假设我有一个包含5个字符串的列表,如:
AAAAB
BBBBA
BBBBA
ABBBB
我想找到并计算每个可能的4个字符的子字符串,并跟踪它们来自的唯一5个字符的字符串的数量。这意味着虽然BBBB存在于三个不同的字符串源中,但只有两个唯一的源
示例输出:
substring repeats unique sources
0 AAAA 1 1
1 AAAB 1 1
2 BBBB 3 2
3 BBBA 2 1
4 ABBB 1 1
我已经设法在一个小规模上做到了这一点,只使用了Python,一个更新的字典,以及两个用于比较现有子字符串和全长字符串的列表。然而,当将其应用于我的完整数据集(约160000个全长字符串(12个字符)产生1.5亿个子字符串(4个字符))时,持续的字典更新和列表比较过程太慢(我的脚本已经运行了一周了)。 在Python和pandas中,计算所有全长字符串中存在的子字符串的数量既容易又便宜
所以我的问题是:如何有效地计算和更新数据帧中子字符串的唯一全长源的计数
TLDR:根据您描述的数据规模,在我的计算机上进行一次尝试,估计需要约2小时
适用于您的示例:
说明
上述代码的基本思想是循环所有唯一的子字符串,并(对于每个子字符串)使用}方法检查完整字符串列表。这将为循环保存一个(即,不循环每个子字符串的每个完整字符串)。另一个想法是只检查唯一的完整字符串(除了唯一的子字符串);您可以事先保存每个完整字符串的出现次数,并在结尾更正计数
pandas
{基本结构是:
repeats
和unique_sources
李>测试
下面是我用来创建较大输入数据的代码:
所以}长度的字符串:
bigger
是n
{使用打印进度的修改代码(发布在下面),我尝试了
n=150000
和size=12
,并获得了以下初始输出:因此10*685秒/60(秒/分钟)=~114分钟。因此2小时并不理想,但实际上比1周更有用。我不怀疑有一些更聪明的方法可以做到这一点,但如果没有其他发布,这可能会有所帮助
如果您确实使用了这段代码,您可能需要用一些较小的示例来验证结果是否正确。我不确定的一件事是,是否要计算子字符串是否仅出现在每个完整字符串中(即} )。这至少有望是一个小变化
contains
),或者是否要计算它出现在完整字符串中的次数(即^{以下是执行搜索时打印进度的附加代码;在
#PART 2
中只有其他语句:相关问题 更多 >
编程相关推荐