(Python)如何按行排序行,而不是按顺序排序?

时间:2017-01-26 10:36:28

标签: python sorting csv

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

321 ,12,4932
321 ,32,4643
321 ,95,3921
...
143,98,2432
143,28,3910
...
832 ,43,4910
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
......

..同时,如上所示,第一列不应按顺序排序。我需要第一个列顺序是相同的(这可能听起来很奇怪,但由于它是部分分组的,它具有大规模的某种顺序)。

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

3 个答案:

答案 0 :(得分:2)

将行排列成存储在由第一列键入的dict中的列表。如果您希望保留从原始电子表格中读取它们的顺序,请使用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

答案 1 :(得分: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 Grouping Tutorial with Examples

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

答案 2 :(得分:1)

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

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