根据值将成对转换为具有不同行数的列表

Posted

技术标签:

【中文标题】根据值将成对转换为具有不同行数的列表【英文标题】:Converting pairwise to list with varying number of rows based on value 【发布时间】:2015-09-29 04:32:06 【问题描述】:

我有一组成对的起点和终点数据作为行。其中每一个都有从起点移动到目的地的人数。这个人数变化很大(从约 4 人到 >200 人)。

我想要实现的是将这些行转换为列表方式,其中两行代表一个移动......这听起来很不直观,但这是我需要将数据读入映射包的格式正在使用。

我希望下面的图片能更好地说明我正在尝试做的事情 - 红色单元格代表 4 次移动(总计列),然后将其转换为 8 行,起点和终点配对重复 4 次。

Excel 将在此期间工作(作为概念证明),但如果我要处理整个数据集,我将获得超过 200 万条记录(至少) - 所以数据库或 Python 解决方案将需要 - 只是为了生成最终列表的 *.csv 文件。

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

所以 - 我已将此问题标记为 Excel、Access 或 Python 解决方案。我是 VBA 或 Python 的新手,但我愿意接受建议。

更新 非常感谢萨罗!该解决方案效果很好(适当更改了输入和输出 .csv 的文件路径) - 这是从数据中提取的动画的屏幕截图!

【问题讨论】:

你可以直接生成csv文件——它不像输出需要适合Excel...原始数据是什么格式的? 虽然您的可视化效果很好,但如果您还放置一些原始输入数据的 sn-p(我们不知道它是 excel 还是 csv 或其他)并发布您的内容,将会有所帮助到目前为止已经尝试过了。使用 Python 可以轻松地逐行浏览文件,然后根据您的“总计”列使用循环生成新条目。如果你最终还是需要一个 csv 而你还没有开始,那就用 python 试试吧 :) Tim - 它是一个 CSV,我只是用 Excel 来做图片。输出为 CSV 是必需的 @AndrewTice 感谢展示结果,看起来不错 :) 很高兴我能提供帮助。 【参考方案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

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()

我没有在代码中写很多cmets,所以如果您需要,请要求更多说明:)

【讨论】:

感谢您。明天回到办公室时会试一试(现在是澳大利亚的晚上;)) ...虽然也可以说代码看起来很主动并且你正确地假设了数据结构!

以上是关于根据值将成对转换为具有不同行数的列表的主要内容,如果未能解决你的问题,请参考以下文章

具有不同行数的 Scikit Learn 特征联合

Python Pandas - 连接两个具有不同行数和列数的数据框

无法连接具有不同行数的表

将列表转换为字典,然后通过键值将多个字典合并为一个字典

Google表格:根据单元格值返回相同行数的公式

Python读取具有不同行数的csv文件