我如何在 python 中对 csv 文件中的数据进行数字排序

how do i sort data from a csv file numerically in python

我正在编写一个程序,该程序从 csv 文件中获取学生分数,并且需要从最高分到最低分进行排序。 csv 文件如下所示:

乔什 12
约翰 6
弗雷德 8
哈利 7

我试过将项目放在这样的列表中:

 Mylist=[]
csvfile = open (classname,'r')
reader = csv.reader(csvfile)
for row in reader:
    Mylist.append(row)

然后反转列表将数值放在前面:

Mynewlist = []
    for each in Mylist:
        value2 = ''.join(each[0])
        value1 = ''.join(each[1])
        mynewlist.append(value1,value2)

运气不好,我得到了这个错误:

    Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    main()
  File "\SRV-FILE3\ca231$\task 3.py", line 143, in main
    value1 = ''.join(each[1])
IndexError: list index out of range

我使用 ''.join(each[1]) 转换为字符串,然后以相反的顺序追加它们,然后我计划使用 .sort() 对它们进行数字排序,但我无法让它们追加到列表中。

有谁知道如何按数值对 csv 文件的内容进行排序?

我认为你把事情复杂化了。假设您将数据作为列表列表:

data = [("josh", "12"), ("john", "6"), ("fred", "8"), ("harry", "7")]

这当然可以来自CSV,排序无关紧要。您可以通过调用 sorted():

进行排序
sorted(data, key = lambda x: int(x[1]))

lambda是一个函数,它选择每个子列表的第二个元素作为键,即分数,并将其转换为数字进行排序。这打印:

[('john', '6'), ('harry', '7'), ('fred', '8'), ('josh', '12')]

您可以这样做:(根据您的值创建一个字典)

for row in reader:
    my_dict = {row[0]:row[1]}

然后你可以做一个排序字典的表示(字典本质上是无序的,所以这将是一个列表):

import operator
sorted_dict = sorted(my_dict.items(), key=operator.itemgetter(1))

值得注意的是,有更好/更简单的方法来做到这一点(例如 Panda),但至少您学习了一种不同的方法:)

如果您的 CSV 只包含一个姓名和一个数字,并且您的姓名是唯一的,那么

  1. 将 CSV 内容存储为 {name:score} 作为字典
  2. 使用下面的代码根据值(您的情况下的分数)进行排序

    import operator
    
    x = {"josh": 12, "john": 6, "fred": 8, "harry": 7,}
    
    sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1))
    
from operator import itemgetter
result = []
with open("data", 'r') as f:
        r = csv.reader(f, delimiter=' ')
        # next(r, None)  # skip the headers
        for row in r:
            result.append(row[:-1])
# sort by numeric part, which is a key value for sorted.
# itemgetter(1) gets the number in each sublist
print(sorted(result,key=itemgetter(1)))

[['josh', '12'], ['john', '6'], ['harry', '7'], ['fred', '8']]

您可以为此使用 pandas

import pandas as pd

df = pd.read_csv('students.csv', header=None)
df.columns = ['Name', 'Score']
df.sort('Score', ascending=False, inplace=True)

最后,您将得到一个如下所示的数据框:

    Name  Score
0   josh     12
2   fred      8
3  harry      7
1   john      6

代码正在读取您的 CSV 文件,并明确声明没有 header。默认情况下 pandas 假定第一行包含列 header。由于没有任何 header,因此我们添加它们:NameScore。最后,我们根据 Score 列进行就地排序。您可以通过删除 inplace= 参数并执行以下操作来保持原始数据帧不变:

sorted_df = df.sort('Score', ascending=False)

在这一行之后,您将在 df 中拥有原始文件,在 sorted_df

中拥有排序后的文件

如果 csv 文件中的 data 如下所示:

josh 12
john 6
fred 8
harry 7

然后你可以创建一个dictionary并使用key=d.__getitem__:

import csv
with open('yourfile.csv', 'rb') as f:
    reader = csv.reader(f)
    d = {}
    for row in f:
        row = row.split(",")
        d[row[0]]=int(row[1]) 
k = sorted(d, key=d.__getitem__, reverse=True)
v = sorted(d.values(), reverse=True)
sorted_d = zip(k,v)
print (sorted_d)

输出:

[('josh', 12), ('fred', 8), ('harry', 7), ('john', 6)]