1

Excel ドキュメントから特定の列の特定の値のすべての変数を計算しようとしています。列を反復処理して、各インスタンスの合計を計算できるようにしたい...たとえば、成績「A」を受け取った学生の数。

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

test.xls:

名前、クラス、グレード

ジェームズ、数学、A

ジュディ、数学、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

実際の出力:

Counter({'グレード': 1})

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

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

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

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

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

各成績が異なるリストに表示されているため、リストをマージ/連結して合計を取得することができませんでした。また、目的の出力形式ではありません。

4

2 に答える 2

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

于 2016-08-18T13:37:20.427 に答える
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

これが役立つことを願っています。

于 2016-08-18T13:48:21.117 に答える