2016-08-18 1 views
1

Я пытаюсь вычислить все переменные определенного значения в данном столбце из документа Excel. Я хочу иметь возможность перебирать столбец и вычислять общее количество каждого экземпляра ... например. сколько студентов получили оценку «А».Как вычислить переменные из столбцов таблицы, используя xlrd?

Вот то, что я до сих пор ...

test.xls:

Имя, класс, класс

Джеймс, Math, A

Judy, математика, A

Билл, Общественные науки, B

Denice, История, C

Сара, История, B

Вот мой питон скрипт

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 

Ожидаемый результат:

A = 2

B = 2

С = 1

Фактический выход:

Счетчик ({ 'класс': 1})

Счетчик ({ 'А': 1})

Счетчик ({'A': 1})

Счетчик ({'B': 1})

Счетчик ({ 'C': 1})

Счетчик ({ 'В': 1})

Поскольку каждый сорт, показывающий в другом списке я не смог слиться/объединить списки, чтобы получить общее количество. Также он не находится в желаемом форматировании вывода.

ответ

0

Вы можете начать инстанцировании Counter, а затем добавить классов к нему в то время как вы итерацию:

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}) 

Если вы хотите, чтобы напечатать выход более элегантным способом, вы можете сделать следующее :

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

Вы должны получить:

A = 2 
C = 1 
B = 2 

Надеюсь, это поможет.

+1

Это почти идеально, спасибо! Также, чтобы закончить вопрос, я смог отформатировать счетчик, используя этот ответ: 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 

Вы создаете список на каждой итерации.

Вы можете использовать список понимание к созданию единого списка всех сортов:

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

Или без понимания:

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

print Counter(grades) 

Вам все еще нужно будет форматировать содержание Counter(grades) к вашему нравится:

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

Примечание:

  1. Я не использую split.

  2. Выход не будет в каком-либо конкретном порядке и фактически может меняться между последовательными прогонами сценария.

Смежные вопросы