【问题标题】:Sorting CSV data using Python使用 Python 对 CSV 数据进行排序
【发布时间】:2012-07-11 09:22:09
【问题描述】:

我真的很想整理一些数据。我有一些数据想使用 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

【问题讨论】:

标签: python sorting csv


【解决方案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 数据库?将数据写入db并选择XYID上的所有数据排序会非常简单

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案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'])
      ...
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2020-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-06
          • 2017-06-23
          • 1970-01-01
          • 1970-01-01
          • 2019-04-06
          相关资源
          最近更新 更多