从excel文件

时间:2017-05-24 01:07:40

标签: excel python-3.x calculation

I have attached a screenshot of the excel file I am working with 我正在尝试阅读这个包含所有状态(列B),县(列C)和人口(列D)的excel文件。我想计算每个州的人口。

我知道我们都有各种各样的方法可以做到这一点,并且肯定有一种方法可以用更少的易于理解的代码来实现。我会很感激,但我也想知道如何以我想的方式做到这一点 - 首先找出唯一的州名,然后循环通过工作表来按状态添加所有列。

这是我的代码:

x = wb.get_sheet_names()
sheet = wb.get_sheet_by_name('Population by Census Tract')
PopData = {}
StateData = []
i = 3
j = 0
k=""

#First value entered
StateData.append(sheet['B' + str(2)].value)

#Unique State Values calculated
for row in range(i, sheet.max_row + 1):
    if any(sheet['B' + str(row)].value in s for s in StateData):
        i=i+1
    else:
        StateData.append(sheet['B' + str(row)].value)
print(StateData)

#Each State's Population calculated
for s in StateData:
    for row in range(2, sheet.max_row + 1):
        if sheet['B' + str(row)].value == StateData[s]:
            j = j + sheet['D' + str(row)].value
    PopData[StateData[s]] = j 
print(PopData)

我收到此错误:

if sheet['B' + str(row)].value == StateData[s]:
TypeError: list indices must be integers or slices, not str

1 个答案:

答案 0 :(得分:0)

以下内容:

for s in StateData:
    for row in range(2, sheet.max_row + 1):
        if sheet['B' + str(row)].value == StateData[s]:
            j = j + sheet['D' + str(row)].value
    PopData[StateData[s]] = j 

s已经是StateData列表的一个元素。你想做的可能是:

for s in StateData:
    for row in range(2, sheet.max_row + 1):
        if sheet['B' + str(row)].value == s:
            j = j + sheet['D' + str(row)].value
    PopData[StateData[s]] = j 

for i, s in enumerate(StateData):
    for row in range(2, sheet.max_row + 1):
        if sheet['B' + str(row)].value == StateData[i]:
            j = j + sheet['D' + str(row)].value
    PopData[StateData[s]] = j 

但第一种选择更优雅,(可能)稍快一些。