我正在尝试订购一个只有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行包含方言“红色标签”下的值,所有其他行都留空。 它位于.csv的Z列中(但不是最后一列)所以我假设列的索引是25(0是第一个)。 任何帮助将不胜感激。
答案 0 :(得分:9)
如何使用pandas?
import pandas as pd
df = pd.read_csv('Full_List.csv')
df = df.sort('red label')
df.to_csv('Full_List_sorted.csv', index=False)
您可能需要将选项调整为read_csv
和to_csv
以匹配CSV文件的格式。
答案 1 :(得分:3)
groupby
不是用于排序,而是用于分块迭代。对于排序使用sorted
。
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以进行正确的数字排序。
答案 2 :(得分:2)
我在测试中发现以下内容适用于我拥有的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()