按列名对CSV进行排序

7

我需要按列名对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的列对此CSV文件进行排序?

只能使用核心Python模块,不能使用Pandas。 :(


只能使用Python模块,不能用Pandas。:( 为什么?这是作业吗? - cs95
1
pandas是Python模块。 - Gahan
你有列名吗?找到名为“Total”的索引并按该索引排序。 - Pavel
你想要什么输出?打印还是写入文件? - Martin Evans
1
然后只需 sort(key=lambda row: row[-1]) - tripleee
显示剩余3条评论
3个回答

7
如果需要按列名排序,建议使用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(),以创建一个按行字典排序的列表。其中 keytotal 字段,如果总数相同,则还是 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

这样的东西,

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.

1
你可以定义一个函数,按照任何列进行排序。
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))

然而,Pandas 是更好的选择。尝试适应它。


很抱歉,这样做不行,因为列数是动态的,所以“Total”不一定会有那个索引。 - That guy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接