-2

我真的很想整理一些数据。我有一些数据想使用 Python 在 CSV 中排序。如果有人可以提供帮助,将不胜感激。它无法在 Excel 中排序,因为行数太多(>1500 万)。

格式如下:

X,Y,Level,ID,XYID
15.5,16.5,1.6,HB01,15.516.5
15.5,17.5,1.4,HB01,15.517.5
15.5,18.5,1.7,HB01,15.518.5
15.5,19.5,1.6,HB01,15.519.5
15.5,20.5,1.2,HB01,15.520.5
15.5,20.5,1.9,HB02,15.520.5
15.5,20.5,2.5,HB03,15.520.5
15.5,20.5,2.1,HB04,15.520.5

XYID 只是 X 和 Y 的连接文本。我希望对数据进行排序,以便在第二个块中,唯一出来的行如下,因为它具有最高级别(第三列)并且具有相同的 XYID

15.5,20.5,2.5,HB03,15.520.5

我希望最终输出是显示前四行的 csv 文件,因为它们具有不同的 XYID,而新的第 5 行显示最大级别:

X,Y,Level,ID,XYID
15.5,16.5,1.6,HB01,15.516.5
15.5,17.5,1.4,HB01,15.517.5
15.5,18.5,1.7,HB01,15.518.5
15.5,19.5,1.6,HB01,15.519.5
15.5,20.5,2.5,HB03,15.520.5
4

4 回答 4

3

像下面这样的东西应该可以工作:

import csv
import itertools

reader = csv.DictReader(open('input.csv', 'rb'))
groups = itertools.groupby(reader, lambda d: d['XYID'])
result = [max(g, key=lambda d: float(d['Level'])) for k, g in groups]

writer = csv.DictWriter(open('output.csv', 'wb'), reader.fieldnames)
writer.writeheader()
writer.writerows(result)

这里的想法是首先根据行的XYID值对行进行分组,然后使用该Level值获取每个组的最大行。

如果您的输入 CSV 文件还没有按XYID值分组的行,您首先需要对行进行排序,以便它们:

reader = csv.DictReader(open('input.csv', 'rb'))
rows = sorted(reader, key=lambda d: d['XYID'])
groups = itertools.groupby(rows, lambda d: d['XYID'])
...
于 2012-07-11T17:41:10.200 回答
1

您可以使用该csv模块读取所有行。

import csv
import decimal
from operator import itemgetter

f = open('your_file')
csv_reader = csv.reader(f)

rows_list = []

将每行 XYID 值转换为小数

for row in csv_reader:
  row[4] = decimal.Decimal(row[4])

将所有行放入列表中

rows_list.append(row)

按 XYID 键排序并写入输出文件。

rows_list.sort(key=itemgetter(4))

我不知道 1500 万行会占用多少内存,或者你有多少可用的内存,所以也许你甚至可以将值写入 python 支持的 sqlite 数据库?将数据写入数据库并选择XYID上的所有数据排序将非常简单

于 2012-07-11T17:27:39.130 回答
1

你可能想看看pandas,它可以读取 CSV 文件并创建一个可以排序的表格数据结构等。它非常擅长处理大型数据集,尽管 1500 万行非常大,所以它总是要依赖关于你有多少内存等。

于 2012-07-11T17:30:06.583 回答
0

假设您的数据仍需要排序:

from itertools import groupby

sorter = lambda r : r[4]

sorteddata = sorted(data, key=sorter)

newdata = (max(g, key=lambda r : float(r[2])) for g in groupby(sorteddata, sorter))
于 2012-07-11T17:45:46.883 回答