CocoaChina 11-12
python-优化基于另一个字段从一个字段中提.
index_new4.html
../../../zaker_core/zaker_tpl_static/wap/tpl_keji1.html

 

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

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

我想使它看起来像这样:

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

第四列中的内容长度差异很大 , 但第二列中的数字始终是顺序的 .

下面的代码是我实际执行的代码 , 但是要花很多时间才能完成 . 截止到目前 , 它已经运行了将近 18 个小时 , 而且刚超过 100 万行 .

我尝试了几种替代方法 , 例如 , 如果连续行的第一列中的名称不同 , 则仅构建映射 , 但这只会向其中添加一条语句 , 并使代码变慢 .

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

import pandas as pd#imports datad = pd.read_csv ( 'INPUT_FILE', sep=' ' ) #acknowledges that data was importedprint "Import Okay" #sets output pathoutput='OUTPUT_FILE' #loops from the first row till the endfor 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=' ', header=False, index=False, mode='a' ) #acknowledges that the code is throughprint "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 onced.to_csv ( output2, sep=' ', header=False, index=False )

相关文章
评论
没有更多评论了
取消

登录后才可以发布评论哦

12 我来说两句…
打开 ZAKER 参与讨论