2016-03-25 4 views
-1

Ich habe eine Tabelle mit Informationen mit zwei Spalten; 'Name' und 'Score/10', gespeichert in einer CSV-Datei. Die cvs-Datei heißt "Jahr-1-Liste". Derzeit kann ich die Tabelle alphabetisch sortieren, basierend auf der Spalte "Name", so dass jeder Name mit der entsprechenden Punktzahl in alphabetischer Reihenfolge ausgegeben wird. Jetzt möchte ich in der Lage sein, die Tabelle basierend auf der Spalte "Score/10" nach der höchsten Punktzahl zuerst und der niedrigsten Punktzahl zuletzt zu sortieren. Kann mir jemand sagen, wie ich das mache? Muss ich die Spalte "Score/10" in eine Liste umwandeln? Mein Code ist wie folgt:Wie sortiere ich eine Spalte mit numerischen Werten in einer Tabelle aus einer CSV-Datei nach dem höchsten zum niedrigsten Wert?

print ("Do you wish to view previous class' results?") 
option = input() 

if option == ("yes"): 
    print ("Which class' results' do you wish to view; 1,2 or 3?") 
    viewyear = int(input()) 

    if viewyear == 1: 
     print ("How do you want to view your results; alpha - alphabetically by name, av - mean score, desc - from highest to lowest?.") 
     viewoption = input() 
     if viewoption == ('alpha'): 
       with open("Year 1 List.csv", "r") as f: 
        for line in sorted(f): 
         print(line) 

Vielen Dank im Voraus

Antwort

0
print next(f) # skip the header we dont want that 
for line in sorted(f,key=lambda line:float(line.split(",")[1])): 

von groben Pandas dies noch einfacher

df = pd.Dataframe.from_csv("my.csv") 
print df.sort("Score /10") 

hier für die letzt bisschen Hilfe würde es in einem Dolmetscher ist (anstelle von f=open("somefile") verwenden wir s=cStringIO.StringIO("""..."""), da wir damit unsere csv-Daten im Beispiel "einschließen")

>>> s = cStringIO.StringIO("""StudentName, Score/10 
... bob,12 
... sue,6 
... billy,18 
... sam,9 
... """) 
>>> print next(s) #the header 
StudentName, Score/10 

>>> for line in sorted(s,key=lambda line:float(line.split(",")[1])): #the rest 
...  print line 
... 
sue,6 

sam,9 

bob,12 

billy,18 
+0

wenn 'line' gedruckt wurde, brachte er einen Fehler zurück: "für Zeile in sortierter (f, key = Lambda-Linie: float (line.split (", ") [ 1])): ValueError: Konnte String nicht in Gleitkomma konvertieren: 'Score/10 \ n' "Wenn ich 'float' herausgenommen habe und die Daten vom niedrigsten zum höchsten Wert ausgegeben habe, würde ein Ergebnis von '10' gezählt werden als '1' in der Reihenfolge von der niedrigsten zur höchsten. Wie kann ich dies ändern a) am höchsten zum niedrigsten b) mit 10 als höchste Punktzahl eingestuft? @joran – MA00

+0

Ich erkannte nicht, dass die Datei den Header-Text darin hatte ... Ich nahm an, dass alle Werte in der 2. Spalte floats waren –

+0

'print next (f)'? Was meinst du damit? Dies überspringt den Header der 2. Spalte nicht. Momentan geht das in die 2. Spaltenüberschrift, aber es enthält es immer noch, wenn es versucht wird, es von String zu Float zu konvertieren - wie kann ich diesen Header überspringen? 'print next (f)' wird nicht funktionieren. Danke – MA00

0

Sie können numpy von Python verwenden. Sie lesen die CSV-Datei von:

import numpy 

reading = numpy.genfromtxt("filename", delimiter = " ") 
sort = numpy.max("column") 
print sort 
+0

Ich würde lieber normale Python-Module verwenden, da nicht alle meine Kollegen das Numpy-Modul installiert haben. Können Sie dies mit vorinstallierten Modulen schreiben? @ astrolabe1993 – MA00

+0

Sie müssen nur schreiben: import numpy. Ich denke, dass es die bessere Lösung ist, um Ihr Problem zu lösen – Deadpool

+0

Ich habe das ausprobiert und es gibt 'ImportError zurück: Kein Modul namens' numpy '' – MA00

Verwandte Themen