[英]how do i sort data from a csv file numerically in python
我正在編寫一個程序,該程序從csv文件中獲取學生分數,然后需要按照從高到低的順序進行排序。 csv文件如下所示:
喬希12
約翰6
fred 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\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包含一個名稱和一個數字,並且您的名稱是唯一的,則
使用下面的代碼基於值進行排序(您的情況是分數)
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']]
您可以為此使用熊貓 。
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文件,並明確指出沒有標題。 默認情況下,pandas假定第一行包含列標題。 由於沒有任何標題,因此我們添加了它們: 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)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.