我有一组成对的原点和目标数据作为行。这些中的每一个都有从原点到目的地的人数。这个人数差异很大(从约4人到> 200人)。
我想要实现的是将这些行转换为列表方式,其中两行表示移动....这听起来很直观,但这是我需要将数据读入映射包的格式我我正在使用。
我希望下面的图片能更好地说明我要做的事情 - 红色单元代表4个移动(总列)然后将其转换为8行,原点和目标配对重复4次。
Excel将在临时工作(作为概念证明),虽然如果我要破解整个数据集,我将获得超过200万条记录(至少) - 所以数据库或Python解决方案将需要 - 只是为了生成最终列表的* .csv文件。
注意 - 总列加倍表示所需的行数 - 因此如果5个人移动,则需要10行。
所以 - 我已经为Excel,Access或Python解决方案标记了这个问题。我是VBA或Python的新手,但我愿意接受建议。
更新 谢谢堆沙龙!该解决方案运行良好(适当改变输入和输出.csv的文件路径) - 这是从数据中抽取动画的屏幕截图!
答案 0 :(得分:1)
我会假设你的输入如下:
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
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()
我在代码中没有写很多评论,如果您需要,请提出更多说明:)