按列nam排序CSV

2024-06-02 06:48:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要按列名对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模块,不能使用panda。:(一)


Tags: csv数据排序静态thomasgreenbluered
3条回答

如果需要使用列名进行排序,最好使用Python^{}对象读取文件,如下所示:

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

您可以定义一个函数来根据任何列进行排序。

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

不过,熊猫是更好的选择。试着习惯一下。

像这样的东西

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.

相关问题 更多 >