2016-08-18 1 views
1

Ich versuche, alle Variablen eines bestimmten Werts in einer bestimmten Spalte aus einem Excel-Dokument zu berechnen. Ich möchte in der Lage sein, über die Spalte zu iterieren und die Summe jeder Instanz zu berechnen ... z. Wie viele Schüler erhielten eine Note "A".Wie berechnet man Variablen aus Arbeitsblattspalten mit xlrd?

Hier ist, was ich bisher ...

test.xls:

Name, Klasse, Grad

James, Mathe, A

Judy, Mathe, A

Bill, Sozialwissenschaften, B

Denice, Geschichte, C

Sarah, Geschichte, B

Hier ist mein Python-Skript

import xlrd 
from collections import Counter 
sh = xlrd.open_workbook('test.xls', on_demand = True).sheet_by_index(0) # Open workbook and sheet 

for rownum in range(sh.nrows): 
    grades = str(sh.cell(rownum, 2).value) # Grab all variables in column 2. 
    print Counter(grades.split('\n')) # Count grades 

Erwartete Ausgabe:

A = 2

B = 2

C = 1

Actual output:

Zähler ({ 'Grade': 1})

Zähler ({ 'A': 1})

Zähler ({'A': 1})

Zähler ({'B': 1})

Zähler ({ 'C': 1})

Zähler ({ 'B': 1})

Da jede Sorte in einer anderen Liste zeigt I nicht in der Lage gewesen, zu fusionieren/Verketten Sie Listen, um eine Summe zu erhalten. Es ist auch nicht in der gewünschten Ausgabeformatierung.

Antwort

0

können Sie beginnen mit einer Counter Instanziieren und dann Noten, um es hinzuzufügen, während Sie durchlaufen:

grades_counter = Counter() 
mysheet = xlrd.open_workbook('grades.xls').sheet_by_index(0) 

for i in range(1,mysheet.nrows): 
    grades_counter += Counter(str(mysheet.row_values(i)[2])) 

print grades_counter 
Counter({'A': 2, 'B': 2, 'C': 1}) 

Wenn Sie schauen, um die Ausgabe in eine elegantere Weise zu drucken, können Sie die folgenden Aktionen durchführen :

for k,v in grades_counter.items(): 
    print "{} = {}".format(k,v) 

sollten Sie erhalten:

A = 2 
C = 1 
B = 2 

Ich hoffe, das hilft.

+1

Das ist fast perfekt, danke! Auch um die Frage zu vervollständigen, war ich in der Lage, den Zähler mit dieser beantworteten Frage zu formatieren: http://stackoverflow.com/questions/20316299/formatting-output-of-counter#20316330 –

0
for rownum in range(sh.nrows): 
    grades = str(sh.cell(rownum, 2).value) # Grab all variables in column 2. 
    print Counter(grades.split('\n')) # Count grades 

Sie erstellen in jeder Iteration eine Liste.

Sie Liste Verständnis zu ein erstellen eine einzelne Liste mit allen Typen verwenden:

grades = [str(sh.cell(rownum, 2).value) for rownum in range(sh.nrows)] 
print Counter(grades) 

Oder verständnislos:

grades = [] 
for rownum in range(sh.nrows): 
    grades.append(str(sh.cell(rownum, 2).value)) 

print Counter(grades) 

Sie noch den Inhalt von Counter(grades) formatiert werden müssten, um Ihre Mögen:

res = Counter(grades) 
for grade, count in res.iteritems(): 
    print '{} = {}'.format(grade, count) 

Beachten Sie, dass:

  1. Ich verwende nicht split.

  2. Die Ausgabe hat keine bestimmte Reihenfolge und kann sich tatsächlich zwischen aufeinanderfolgenden Ausführungen des Skripts ändern.

Verwandte Themen