我有一个非常奇怪的结构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
......
..同时,如上所示,第一列不应按顺序排序。我需要第一个列顺序是相同的(这可能听起来很奇怪,但由于它是部分分组的,它具有大规模的某种顺序)。
什么是解决此问题的最快算法?
答案 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])