【问题标题】:(Python)how to group rows by first column, not sorting by order?(Python)如何按第一列对行进行分组,而不是按顺序排序?
【发布时间】:2017-06-11 19:29:44
【问题描述】:

我有一个结构非常奇怪的 csv 文件。列字段由数字组成,行部分由第一个列字段分组,但不完全分组。 例如,如果列数据是 {number1, number2, number3},则文件将如下所示:

321、12、4932
321、32、4643
321、95、3921
...
143、98、2432
143、28、3910
...
832, 43, 2910
832, 54, 2190
...
572、91、8492
572、92、9302
572、15、3902
...
321、93、7281
321、48、6218
...
832, 78, 0148
832, 91, 7281

问题是我需要将文件按第一列完美分组,所以上面的例子应该是:

321、12、4932
321、32、4643
321、95、3921
321、93、7281
321、48、6218
...
143、98、2432
143、28、3910
...
832、43、2910
832、54、2190
832、78、0148
832、91、7281
...
572、91、8492
572、92、9302
572、15、3902
...

.. 同时,如上所示,第一列不应该按顺序排序。我需要第一列的顺序相同(这可能听起来很奇怪,但由于它是部分分组的,因此它在大范围内具有一定的顺序)。

解决这个问题最快的算法是什么?

【问题讨论】:

    标签: python sorting csv


    【解决方案1】:

    将行排列成列表,这些列表存储在以第一列为键的字典中。如果您希望保留从原始电子表格中读取它们的顺序,请使用 OrderedDict。像这样的东西(未经测试的代码)

    from collections import OrderedDict
    ...
    d = OrderedDict()
    
    # open the csv file as reader
    
    for row in reader:
        key = row[0]
        d.setdefault(key,[]).append(row)
    

    并使用结果

    for key,rowlist in d.items()
        for row in rowlist:
           # do whatever with row
    

    【讨论】:

    • 我使用了 OrderedDict,它的工作做得很好。谢谢。
    【解决方案2】:

    您可以尝试对其进行硬编码,但对于 Python 中的 CSV 文件,我建议使用 Pandas。 Pandas 是专门为 CSV 文件创建的 Python 的 import。您可以相当简单地对数据集进行排序、分组、创建等。您还可以阅读 CSV 文件并创建自定义列和行。如:

    import pandas as pd
    df = pd.DataFrame({'A' : [321,143,832]})
    

    我会留下一些文档链接,您可以在其中找到最适合您在 Python 中实现的需要的函数。 Basic Tutorial . Scroll to GroupingTutorial with Examples

    最简单快捷的方法是将 Pandas 用于您的 CSV

    【讨论】:

      【解决方案3】:

      您可以在解析文件时使用列表和字典,使用字典按第一行对行进行分组,并使用列表保留第一行的顺序:

      grouped_rows = {}
      rows = []
      with open("your_file") as ins:
          for line line in ins:
              first = line.split(",")[0]
              if first in rows:
                  grouped_rows[first].append(line)
                  continue
              rows.append(first)
              grouped rows[first] = [line]
      

      然后您可以通过简单地解析列表并从字典中检索数据来打印它们:

      for row in rows:
          print "\n".join(grouped_rows[row])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        相关资源
        最近更新 更多