gpt4 book ai didi

python - 优化基于另一个字段从一个字段中提取子字符串的循环

转载 作者:太空宇宙 更新时间:2023-11-03 15:06:47 25 4
gpt4 key购买 nike

我正在处理大型数据集(4 百万 x 4)。第一列是名称标识符,许多行具有相同的名称。第二列是一个位置,从 -6 开始,一直向上,直到遇到新的标识符,然后重新开始计数。第三列是一个随机数,这里不重要。第四列是一长串数字,就像一条长长的条形码。数据看起来有点像这样:

YKLOI    -6    01    123456789012345678901234
YKLOI -5 25 123456789012345678901234
YKLOI -4 05 123456789012345678901234
YKLOI -3 75 123456789012345678901234
YKLOI -2 83 123456789012345678901234
YKLOI -1 05 123456789012345678901234
YKLOI 0 34 123456789012345678901234
YKLOI 1 28 123456789012345678901234
YKLJW -6 87 569845874254658425485
YKLJW -5 87 569845874254658425485
...

我想让它看起来像这样:

YKLOI    -6    01    123   #puts 1st triplet in position -6
YKLOI -5 25 456 #puts 2nd triplet in position -5
YKLOI -4 05 789 #puts 3rd triplet in position -4
YKLOI -3 75 012 #puts 4th triplet in position -3
YKLOI -2 83 345 ...
YKLOI -1 05 678
YKLOI 0 34 901
YKLOI 1 28 234 #puts last triplet in the last position
YKLJW -6 87 569 #puts 1st triplet in position -6
YKLJW -5 87 845 #puts 2nd triplet in position -5
...

第四列的长度变化很大,但第二列的数字始终按顺序排列。

下面的代码是我得到的代码,它实际上可以完成这项工作,但它需要很长时间才能完成。截至目前,它运行了将近18个小时,勉强超过100万条线。

我尝试了一些替代方案,例如仅在连续行中第一列中的名称不同时才构建映射,但这只会向其中添加一条语句并使代码慢得多。

有没有人对如何提高此任务的性能有建议?

import pandas as pd

#imports data
d = pd.read_csv('INPUT_FILE', sep='\t')

#acknowledges that data was imported
print "Import Okay"

#sets output path
output='OUTPUT_FILE'

#loops from the first row till the end
for z in xrange(0,len(d)-1):

#goes to the fourth column, split the content every 3 characters and creates
#a list of these triplets.
mop=map(''.join, zip(*[iter(d.loc[z][3])]*3))

#substitutes the content of the fourth column in the z line by the triplet in
#the z+6 positon
d.ix[z,3] = mop[int(d.loc[z][1])+6]

#writes the new z line into the output file
d.loc[[z]].to_csv(output, sep='\t', header=False, index=False, mode='a')

#acknowledges that the code is through
print "Done"

最佳答案

从两个简单的改变开始。第一,不要增量写入输出文件,它会增加很多不必要的开销,并且是您目前最大的问题。

其次,您似乎要经过很多步骤才能拉出三胞胎。这样的事情会更有效率,并且 .apply 消除了一些循环开销。

def triplet(row):
loc = (row[1] + 6) * 3
return row[3][loc:loc+3]

d[3] = d.apply(triplet, axis=1)

# save the whole file once
d.to_csv(output2, sep='\t', header=False, index=False)

关于python - 优化基于另一个字段从一个字段中提取子字符串的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31765892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com