我如何在 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 只包含一个姓名和一个数字,并且您的姓名是唯一的,那么
- 将 CSV 内容存储为 {name:score} 作为字典
使用下面的代码根据值(您的情况下的分数)进行排序
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,因此我们添加它们:Name
和 Score
。最后,我们根据 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)]
我正在编写一个程序,该程序从 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 只包含一个姓名和一个数字,并且您的姓名是唯一的,那么
- 将 CSV 内容存储为 {name:score} 作为字典
使用下面的代码根据值(您的情况下的分数)进行排序
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,因此我们添加它们:Name
和 Score
。最后,我们根据 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)]