2016-08-18 19 views
1

Excelドキュメントから特定の列の特定の値のすべての変数を計算しようとしています。私は列を繰り返して、各インスタンスの合計を計算できるようにしたいと考えています。どのくらいの数の学生がグレード「A」を受けましたか。ここでxlrdを使用してワークシート列から変数を計算する方法は?

は、私がこれまで持っているものです...

Test.xlsを:

名、クラス、学年

ジェームズ、数学、

ジュディ、数学、 A

ビル、社会調査、B

デーニチェ、歴史、C

サラ、歴史、B

ここでは私のPythonスクリプトは、

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

C = 1

実際の出力:

カウンタ({ 'グレード':1})

カウンタ({ 'A':1})

カウンタ({'A':1})

カウンタ({'B':1})

カウンタ({ 'C':1})

カウンタ({ 'B':1})

各グレードのI /マージすることができなかった別のリストに表示されるようにリストを連結して合計を得る。また、それは望ましい出力書式ではありません。

答えて

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. 出力は特定の順序ではなく、実際にはスクリプトの連続実行間で変更される可能性があります。

関連する問題