簡體   English   中英

如何在python中以數字方式對csv文件中的數據進行排序

[英]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包含一個名稱和一個數字,並且您的名稱是唯一的,則

  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']]

您可以為此使用熊貓

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假定第一行包含列標題。 由於沒有任何標題,因此我們添加了它們: 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)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM