将两两转换为基于值的不同行数列表

我有一组成对的起源和目标数据作为行。 每个人都有从原点到目的地的人数。 这个数字相差很大(从4人到200人)。

我想要实现的是将这些行转换为列表明智的地方,其中两行代表一个移动….这听起来反直观,但它是我需要将数据读取到我使用的映射包中的格式。

我希望下面的图像更好地说明了我正在尝试做的事 – 红色单元格表示4次移动(Total列),然后将其转换为8行,原点和目的地重复4次。

Excel将在此期间工作(作为一个概念certificate),但是如果我要closures整个数据集,我将获得两百万条logging(至less) – 所以需要数据库或Python解决scheme – 只是为了生成最终列表的* .csv文件。

注意 – Total列加倍表示需要的行数 – 所以如果5个人移动,它将需要10行。

原理图更改

所以 – 我已经将这个问题标记为Excel,Access或Python解决scheme。 我是VBA或者Python的新手,但是可以提供build议。

更新谢谢堆萨罗! 该解决scheme工作得很好(适当改变input和输出.csv的文件path) – 这里是从数据中获得的animation的屏幕截图!

在这里输入图像说明

我会假设你的input如下所示:

origx, origy, destx, desty, Total 0.0, 0.0, 1.1, 1.1, 2 151.1556, -33.9113, 150.9991, -33.7297, 4 

将其转换为:

 ID, X, Y, Column pair 1, 0.0, 0.0, origx|origy 1, 1.1, 1.1, destx|desty 2, 0.0, 0.0, origx|origy 2, 1.1, 1.1, destx|desty 3, 151.1556, -33.9113, origx|origy 3, 150.9991, -33.7297, destx|desty 4, 151.1556, -33.9113, origx|origy 4, 150.9991, -33.7297, destx|desty 5, 151.1556, -33.9113, origx|origy 5, 150.9991, -33.7297, destx|desty 6, 151.1556, -33.9113, origx|origy 6, 150.9991, -33.7297, destx|desty 

Python代码

 def write_header(f): f.write('ID, X, Y, Column pair\n') def skip_header(f): f.next() def main(): my_id = 1 with open('input.csv', 'r') as in_f: skip_header(in_f) with open('output.csv', 'w') as out_f: write_header(out_f) for line in in_f: orig_x, orig_y, dest_x, dest_y, total = \ [x.strip() for x in line.split(',')] for idx in range(int(total)): out_f.write( '{}, {}, {}, origx|origy\n'.format(my_id, orig_x, orig_y)) out_f.write( '{}, {}, {}, destx|desty\n'.format(my_id, dest_x, dest_y)) my_id += 1 if __name__ == '__main__': main() 

我没有在代码中写很多评论,所以如果你需要的话,请询问更多的说明:)