如何使用 xlrd 从工作表列中计算变量?
How to calculate variables from worksheet columns using xlrd?
我正在尝试计算 Excel 文档中给定列中特定值的所有变量。我希望能够遍历该列并计算每个实例的总数......例如有多少学生获得了成绩 "A"。
这是我目前所知道的...
test.xls:
Name, Class, Grade
James, Math, A
Judy, Math, A
Bill, Social Studies, B
Denice, History, C
Sarah, History, 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({'Grade': 1})
Counter({'A': 1})
Counter({'A': 1})
Counter({'B': 1})
Counter({'C': 1})
Counter({'B': 1})
由于每个年级都显示在不同的列表中,因此我无法 merge/concatenate 列出列表以获得总数。它也不是所需的输出格式。
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)
注意:
我没有使用 split
。
输出不会按任何特定顺序排列,实际上可能会在脚本的连续运行之间发生变化。
您可以从实例化一个 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
希望对您有所帮助。
我正在尝试计算 Excel 文档中给定列中特定值的所有变量。我希望能够遍历该列并计算每个实例的总数......例如有多少学生获得了成绩 "A"。
这是我目前所知道的...
test.xls:
Name, Class, Grade
James, Math, A
Judy, Math, A
Bill, Social Studies, B
Denice, History, C
Sarah, History, 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({'Grade': 1})
Counter({'A': 1})
Counter({'A': 1})
Counter({'B': 1})
Counter({'C': 1})
Counter({'B': 1})
由于每个年级都显示在不同的列表中,因此我无法 merge/concatenate 列出列表以获得总数。它也不是所需的输出格式。
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)
注意:
我没有使用
split
。输出不会按任何特定顺序排列,实际上可能会在脚本的连续运行之间发生变化。
您可以从实例化一个 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
希望对您有所帮助。