在python中使用.csv按特定列数据排序

在python中使用.csv按特定列数据排序,python,sorting,csv,Python,Sorting,Csv,我正在尝试订购一个包含300多个条目的.csv文件,并按方言下某个特定列中的数值顺序将其全部输出。 这是我到目前为止编写的代码,但它似乎只是在数据进入时输出数据 import csv import itertools from itertools import groupby as gb reader = csv.DictReader(open('Full_List.csv', 'r')) groups = gb(reader, lambda d: d['red label']) resul

我正在尝试订购一个包含300多个条目的.csv文件,并按方言下某个特定列中的数值顺序将其全部输出。 这是我到目前为止编写的代码,但它似乎只是在数据进入时输出数据

import csv
import itertools
from itertools import groupby as gb

reader = csv.DictReader(open('Full_List.csv', 'r'))

groups = gb(reader, lambda d: d['red label'])
result = [max(g, key=lambda d: d['red label']) for k, g in groups]



writer = csv.DictWriter(open('output.csv', 'w'), reader.fieldnames)
writer.writeheader()
writer.writerows(result)
整个文件中只有50行包含方言“red label”下的值,其他所有行都留空。 它在.csv的Z列中(但不是最后一列),所以我假设该列的索引是25(0是第一个)。
任何帮助都将不胜感激。

groupby
不是用于排序,而是用于对iterable进行分块。对于排序,请使用已排序的

import csv

reader = csv.DictReader(open('Full_List.csv', 'r'))
result = sorted(reader, key=lambda d: float(d['red label']))

writer = csv.DictWriter(open('output.csv', 'w'), reader.fieldnames)
writer.writeheader()
writer.writerows(result)
注意:我更改了lambda以将字符数据转换为float以进行正确的数字排序。

如何使用


您可能需要将选项调整为
read_csv
to_csv
,以匹配您的csv文件的格式。

我通过测试发现以下选项适用于我拥有的csv文件。请注意,列的所有行都有有效的条目

from optparse import OptionParser
# Create options.statistic using -s
# Open and set up input file
ifile = open(options.filein, 'rb')
reader = cvs.DictReader(ifile)
# Create the sorted list
try:
  print 'Try the float version'
  sortedlist = sorted(reader, key = lambda d: float(d[options.statistic]), reverse=options.high)
except ValueError:
  print 'Need to use the text version'
  ifile.seek(0)
  ifile.next()
  sortedlist = sorted(reader, key=lambda d: d[options.statistic], reverse=options.high)
# Close the input file. This allows the input file to be the same as the output file
ifile.close()
# Open the output file
ofile = open(options.fileout, 'wb')
writer = csv.DictWriter(ofile, fieldnames=outfields, extrasactions='ignore', restval = '')
# Output the header
writer.writerow(dict((fn, fn) for fn in outfields))
# Output the sorted list
writer.writerows(sortedlist)
ofile.close()

groupby
不是用于排序,而是用于对一个iterable进行分块。从文档中可以看到:“通常情况下,iterable需要在同一个键函数上进行排序。”我试过了,得到了以下错误:ValueError:无法将字符串转换为float:我将强制转换从float更改为str。它编译了,但它完全消除了它从
ValueError
中排序的列中的所有值
d['red label']
似乎并不总是返回数字数据。有空字段吗?至于“它完全删除了列中的所有值”,我认为情况并非如此。此代码不会覆盖任何值。查看您的实际数据会很有帮助。是的。该列中除了50个条目外,其他所有条目都是空白字段。如果这些空白字段可以按照值
0.0
进行排序,则将
float(d['red label'])
更改为
float(d['red label']),如果d['red label']),否则为0.0
@AzKai:发布文件的前十行。这里有些地方不太对劲。我尝试过使用您告诉我的pandas方法,但每当我运行脚本时,就会出现错误“不存在模块pandas”即使我已经使用sudo apt get install python pandas从我的python目录安装了它,你使用的是哪个版本的python和什么操作系统?我在Ubuntu 12.10Edit上使用的是python 3.2:我已经找到了运行pandas的问题所在。当我安装它时,它被安装到我的python2.7文件夹中,但当我运行脚本时,它是从python3.2文件夹中运行的,该文件夹与2.7版本的目录相同,即/usr/local/lib,我不知道如何将脚本更改为从该目录中运行。最后,我解决了pandas错误,但输出仍然与上面的相同史蒂文给我的方法
from optparse import OptionParser
# Create options.statistic using -s
# Open and set up input file
ifile = open(options.filein, 'rb')
reader = cvs.DictReader(ifile)
# Create the sorted list
try:
  print 'Try the float version'
  sortedlist = sorted(reader, key = lambda d: float(d[options.statistic]), reverse=options.high)
except ValueError:
  print 'Need to use the text version'
  ifile.seek(0)
  ifile.next()
  sortedlist = sorted(reader, key=lambda d: d[options.statistic], reverse=options.high)
# Close the input file. This allows the input file to be the same as the output file
ifile.close()
# Open the output file
ofile = open(options.fileout, 'wb')
writer = csv.DictWriter(ofile, fieldnames=outfields, extrasactions='ignore', restval = '')
# Output the header
writer.writerow(dict((fn, fn) for fn in outfields))
# Output the sorted list
writer.writerows(sortedlist)
ofile.close()