我需要按列名对CSV表进行排序。我在CSV中获得的数据具有不同数量的列,但列名称是静态的。这是我的数据:
X,Blue,Black,Red,Green,Total
Thomas,2,0,0,0,2
Andy,0,1,0,0,1
Luise,0,0,2,1,3
Mark,1,0,0,1,2
Ronda,0,1,0,1,2
漂亮的印刷品:
X Blue Black Red Green Total
Thomas 2 0 0 0 2
Andy 0 1 0 0 1
Luise 0 0 2 1 3
Mark 1 0 0 1 2
Ronda 0 1 0 1 2
通常我可以按row[5]
排序,但是如果我得到一张没有任何绿色的桌子,或者带有额外列的表格 - 黄色,它将不再有效。
因此问题是,如何通过名为Total
?
只能使用核心python模块,没有熊猫。 :(
答案 0 :(得分:5)
如果需要使用列名进行排序,最好使用Python csv.DictReader()
对象读取文件,如下所示:
import csv
with open('input.csv', 'r', newline='') as f_input:
csv_input = csv.DictReader(f_input)
data = sorted(csv_input, key=lambda row: (row['Total'], row['X']))
with open('output.csv', 'w', newline='') as f_output:
csv_output = csv.DictWriter(f_output, fieldnames=csv_input.fieldnames)
csv_output.writeheader()
csv_output.writerows(data)
这将允许您根据Total
列进行排序,无论它在何处。 csv.DictReader()
将每一行作为字典读取,使用第一行作为标题。然后,可以将标头值用作字典键来访问项目,而不是使用具有正常csv.reader()
的位置值。因此,您的第一个数据行将被读作:
{'Total': '1', 'Blue': '0', 'Black': '1', 'Green': '0', 'X': 'Andy', 'Red': '0'}
然后可以将 csv_input
直接传递给sorted()
以创建行字典的排序列表。对于总数相同的情况,key
是total
字段,然后是X
字段。
然后将按如下方式编写已排序的output.csv
:
X,Blue,Black,Red,Green,Total
Andy,0,1,0,0,1
Mark,1,0,0,1,2
Ronda,0,1,0,1,2
Thomas,2,0,0,0,2
Luise,0,0,2,1,3
答案 1 :(得分:1)
像这样,
reader = csv.reader(open('input.csv'))
header = reader.next()
sort_col_idx = header.index('Total')
sorted(reader, key=lambda row: row[sort_col_idx]) # Without header
[header] + sorted(reader, key=lambda row: row[sort_col_idx]) # With headers.
答案 2 :(得分:0)
您可以定义一个根据任何列进行排序的函数。
import csv
import operator
data = csv.reader(open('input.csv'))
# function to sort according to any column.
# table corresponds to data and col is argument for the row number. here 5
def sort_table(table, col=0):
return sorted(table, key=operator.itemgetter(col))
print(sort_table(data, 5))
然而,大熊猫是更好的选择。试着习惯它。